如何在 GitHub 操作上参数化秘密

How to parameterize secrets on GitHub Action

我们在存储库 (dev/prd) 中有两个分支,每个分支代表一个部署环境。我们还有每个分支的 GitHub 个动作秘密,在开发分支中它应该是 dev_react_api,在 prd 分支中它应该是 prd_react_api.

现在我们正在使用这些秘密 secrets.dev_react_api 和 secrets.prd_react_api

开发 GitHub 操作工作流程

是否有像下面这样参数化 GitHub 操作机密的解决方案?

# only pseudo-code
env:
  branch_name: github.ref

secrets["${env.branch_name}_react_api"]

它应该像您使用动态名称显示的那样工作。 secrets 只是一个变量,您可以显式 secrets.x 隐式 secrets['x'] 提供键名。动态构建您的密钥就可以正常工作。额外的 env branch_name 也是不需要的,因为您可以直接在字符串中获取该值。

如果您有付费的 GitHub 计划或正在使用 public 存储库,您还可以查看 Environments,它通过定义两个单独的来完全解决这个问题每个环境都有所需的秘密。

您可以为此使用环境机密。

首先转到:设置 -> 环境 -> 新环境

创建一个新环境并确保您的环境名称与您的分支名称匹配

现在您可以创建任何您想要的环境机密,现在的诀窍是,您需要两个文件才能使用环境机密。第一个是 main.yml 第二个是你的(例如)deploy.yml

on:
  push:
    branches:
    - main
    - staging
    - development
    
permissions: write-all

jobs:  
  deploy:
    uses: ./.github/workflows/deploy.yml
    with:
      environment: ${{ github.ref_name }}
    secrets:
      AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }}

第二个使用环境的文件:

name: Deployment


on:
  workflow_call:
    inputs:
      environment:
        required: true
        type: string
    secrets:
      AWS_S3_BUCKET:
        required: true


jobs:
  deploy:
    name: Deploy
    environment: ${{ github.ref_name }}
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@master
      - uses: jakejarvis/s3-sync-action@master
        name: Deploy to S3
        env:
          AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }}
        with:
          args: --acl public-read --follow-symlinks --delete

现在您可以创建任意数量的具有不同参数的环境!

有关详细信息,请参阅:https://github.com/olivatooo/github-actions-build-deploy-with-staging-production-environment/