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

如何将步骤输出变量按需加入GitHub Actions策略矩阵?

问题

我有一个GitHub Actions工作流,原本硬编码了APP_APPROVAL和DB_APPROVAL作为策略矩阵的envName值,用于指定环境。现在需要实现:如果${{ steps.getenv.outputs.recenvironments }}的值不为空,就把它加入矩阵;如果为空则不添加。

当前的工作流代码如下:

Approvals: 
  name: Approvals
  runs-on:
    group: "ARE-Shared"

  strategy:
    matrix:
      envName: [APP_APPROVAL, DB_APPROVAL,  ${{ steps.getenv.outputs.recenvironments }}]
      #include:
      #   - envName: ${{ steps.getenv.outputs.recenvironments }}
  environment:     ${{ matrix.envName }}

  steps:

    - name: Extract Environment from SERVER_ENVIRONMENT
      id: getenv
      run: |

        #for testing purpose hard-coding the value of variable instead of getting it dynamically. 
        $recenvironments = "Production"
        #$recenvironments = "${{ steps.getsnowdetails.outputs.invhosts_env }}"
        echo "recenvironments=$recenvironments" >> "$env:GITHUB_OUTPUT"

但运行时出现YAML语法错误:

Invalid workflow file: .github/workflows/wdadevDBexecutionscripts.yml#L17
error parsing called workflow
".github/workflows/wdadev.yml"
-> "mmctech/DevOps/.github/workflows/newexecutescript.yml@newmmtmp" (source branch with sha:67fb319c3dcd076e9498a84ef1183f04f3cb9ce0)
: You have an error in your yaml syntax on line 154

解决方案

GitHub Actions的矩阵不能直接在静态数组中插入动态值(空值会直接导致YAML语法错误),需要先在步骤里生成完整的矩阵列表,再用fromJSON动态构建矩阵。

修改后的完整代码

Approvals: 
  name: Approvals
  runs-on:
    group: "ARE-Shared"

  steps:
    - name: Extract Environment from SERVER_ENVIRONMENT
      id: getenv
      run: |
        # 测试用硬编码,实际可替换为动态获取逻辑
        $recenvironments = "Production"
        # $recenvironments = "${{ steps.getsnowdetails.outputs.invhosts_env }}"
        
        # 初始化基础环境列表
        $envList = @("APP_APPROVAL", "DB_APPROVAL")
        
        # 若可选环境不为空,追加到列表
        if (-not [string]::IsNullOrEmpty($recenvironments)) {
          $envList += $recenvironments
        }
        
        # 转换为JSON格式输出,供矩阵调用
        $jsonEnvList = $envList | ConvertTo-Json -Compress
        echo "envList=$jsonEnvList" >> "$env:GITHUB_OUTPUT"

  # 动态构建策略矩阵
  strategy:
    matrix:
      envName: ${{ fromJSON(steps.getenv.outputs.envList) }}
  environment: ${{ matrix.envName }}

核心逻辑说明

  1. 提前生成完整列表:在getenv步骤中用PowerShell逻辑判断是否添加可选环境,生成包含所有需要运行的环境列表后转为JSON格式
  2. 动态加载矩阵:使用fromJSON()将JSON字符串解析为矩阵的数组,彻底避免空值引发的YAML语法问题
  3. 调整执行顺序:把矩阵定义放到步骤之后,确保能正确获取getenv步骤输出的动态值(GitHub Actions步骤按顺序执行,矩阵可引用前置步骤的输出)

内容的提问来源于stack exchange,提问作者Ashar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 12:57:47