You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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代码中),又方便后续维护:

  1. 进入仓库Settings → Environments,分别创建dev、qa、uat、load、prod环境
  2. 为每个环境添加对应的变量(如AWS_REGION、SYSTEM)和机密(如AWS密钥)
  3. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:45:36