如何在Github Actions中按指定环境传递自定义环境变量
问题解决:根据选择的环境加载对应自定义变量
你当前的Workflow里,env字段用了嵌套对象来定义各环境变量,但GitHub Actions不支持这种嵌套结构,没法直接通过选择的环境名获取对应变量。下面是几种可行的实现方案:
原Workflow代码(已翻译为中文)
name: Adios CD 流水线 on: workflow_dispatch: inputs: ENVIRONMENT: type: choice description: '选择要部署的环境' required: true options: - dev - qa - uat - load - prod default: 'dev' env: Dev: AWS_REGION: "us-east-1" STAGE: "${{ github.event.inputs.ENVIRONMENT }}" SYSTEM: "ADIOSAPP" QA: AWS_REGION: "us-east-1" STAGE: "${{ github.event.inputs.ENVIRONMENT }}" SYSTEM: "ADIOSAPP" jobs: build: name: "将 ${{ github.ref_name }} 分支部署到 ${{ github.event.inputs.ENVIRONMENT }} 环境" runs-on: ubuntu-latest environment: ${{ github.event.inputs.ENVIRONMENT }} steps: - name: 拉取代码 uses: actions/checkout@v3 - name: 配置AWS凭证 uses: aws-actions/configure-aws-credentials@v1 with: aws-region: ${{ env.AWS_REGION }}
方案一:JSON映射+fromJSON动态解析变量
把所有环境变量定义成JSON格式的映射,通过fromJSON函数根据选择的环境名动态提取对应变量,适合变量不多、需要集中管理的场景:
name: Adios CD 流水线 on: workflow_dispatch: inputs: ENVIRONMENT: type: choice description: '选择要部署的环境' required: true options: - dev - qa - uat - load - prod default: 'dev' env: # 定义全环境变量映射,key与下拉选项的环境名保持一致(小写) ENV_VARS_MAP: | { "dev": {"AWS_REGION": "us-east-1", "SYSTEM": "ADIOSAPP"}, "qa": {"AWS_REGION": "us-east-1", "SYSTEM": "ADIOSAPP"}, "uat": {"AWS_REGION": "us-west-2", "SYSTEM": "ADIOSAPP"}, "load": {"AWS_REGION": "eu-west-1", "SYSTEM": "ADIOSAPP"}, "prod": {"AWS_REGION": "us-east-1", "SYSTEM": "ADIOSAPP_PROD"} } jobs: build: name: "将 ${{ github.ref_name }} 分支部署到 ${{ github.event.inputs.ENVIRONMENT }} 环境" runs-on: ubuntu-latest environment: ${{ github.event.inputs.ENVIRONMENT }} # 解析当前环境的变量,作为Job级环境变量 env: AWS_REGION: ${{ fromJSON(env.ENV_VARS_MAP)[github.event.inputs.ENVIRONMENT].AWS_REGION }} SYSTEM: ${{ fromJSON(env.ENV_VARS_MAP)[github.event.inputs.ENVIRONMENT].SYSTEM }} STAGE: ${{ github.event.inputs.ENVIRONMENT }} steps: - name: 拉取代码 uses: actions/checkout@v3 - name: 配置AWS凭证 uses: aws-actions/configure-aws-credentials@v1 with: aws-region: ${{ env.AWS_REGION }} - name: 验证变量 run: | echo "当前环境: ${{ env.STAGE }}" echo "AWS区域: ${{ env.AWS_REGION }}" echo "系统标识: ${{ env.SYSTEM }}"
方案二:利用GitHub Environments内置变量(推荐)
GitHub仓库的Environments功能支持为每个环境单独配置变量和机密,既安全(机密不会暴露在Workflow代码中),又方便后续维护:
- 进入仓库
Settings→Environments,分别创建dev、qa、uat、load、prod环境 - 为每个环境添加对应的变量(如
AWS_REGION、SYSTEM)和机密(如AWS密钥) - 修改Workflow代码直接引用环境级变量:
name: Adios CD 流水线 on: workflow_dispatch: inputs: ENVIRONMENT: type: choice description: '选择要部署的环境' required: true options: - dev - qa - uat - load - prod default: 'dev' jobs: build: name: "将 ${{ github.ref_name }} 分支部署到 ${{ github.event.inputs.ENVIRONMENT }} 环境" runs-on: ubuntu-latest environment: ${{ github.event.inputs.ENVIRONMENT }} env: STAGE: ${{ github.event.inputs.ENVIRONMENT }} steps: - name: 拉取代码 uses: actions/checkout@v3 - name: 配置AWS凭证 uses: aws-actions/configure-aws-credentials@v1 with: aws-region: ${{ vars.AWS_REGION }} # 引用环境级公开变量 aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} # 引用环境机密 aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - name: 验证变量 run: | echo "当前环境: ${{ env.STAGE }}" echo "AWS区域: ${{ vars.AWS_REGION }}" echo "系统标识: ${{ vars.SYSTEM }}"
方案三:步骤内通过Shell命令动态设置变量
适合变量逻辑简单、不需要集中管理的场景,通过case语句根据选择的环境写入变量:
name: Adios CD 流水线 on: workflow_dispatch: inputs: ENVIRONMENT: type: choice description: '选择要部署的环境' required: true options: - dev - qa - uat - load - prod default: 'dev' jobs: build: name: "将 ${{ github.ref_name }} 分支部署到 ${{ github.event.inputs.ENVIRONMENT }} 环境" runs-on: ubuntu-latest environment: ${{ github.event.inputs.ENVIRONMENT }} steps: - name: 拉取代码 uses: actions/checkout@v3 - name: 动态设置环境变量 run: | case "${{ github.event.inputs.ENVIRONMENT }}" in dev) echo "AWS_REGION=us-east-1" >> $GITHUB_ENV echo "SYSTEM=ADIOSAPP" >> $GITHUB_ENV ;; qa) echo "AWS_REGION=us-east-1" >> $GITHUB_ENV echo "SYSTEM=ADIOSAPP" >> $GITHUB_ENV ;; uat) echo "AWS_REGION=us-west-2" >> $GITHUB_ENV echo "SYSTEM=ADIOSAPP" >> $GITHUB_ENV ;; load) echo "AWS_REGION=eu-west-1" >> $GITHUB_ENV echo "SYSTEM=ADIOSAPP" >> $GITHUB_ENV ;; prod) echo "AWS_REGION=us-east-1" >> $GITHUB_ENV echo "SYSTEM=ADIOSAPP_PROD" >> $GITHUB_ENV ;; esac echo "STAGE=${{ github.event.inputs.ENVIRONMENT }}" >> $GITHUB_ENV - name: 配置AWS凭证 uses: aws-actions/configure-aws-credentials@v1 with: aws-region: ${{ env.AWS_REGION }} - name: 验证变量 run: | echo "当前环境: ${{ env.STAGE }}" echo "AWS区域: ${{ env.AWS_REGION }}" echo "系统标识: ${{ env.SYSTEM }}"
内容的提问来源于stack exchange,提问作者Raghu Ram
相关产品推荐
相关产品推荐

