如何将步骤输出变量按需加入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 }}
核心逻辑说明
- 提前生成完整列表:在
getenv步骤中用PowerShell逻辑判断是否添加可选环境,生成包含所有需要运行的环境列表后转为JSON格式 - 动态加载矩阵:使用
fromJSON()将JSON字符串解析为矩阵的数组,彻底避免空值引发的YAML语法问题 - 调整执行顺序:把矩阵定义放到步骤之后,确保能正确获取
getenv步骤输出的动态值(GitHub Actions步骤按顺序执行,矩阵可引用前置步骤的输出)
内容的提问来源于stack exchange,提问作者Ashar
相关产品推荐
相关产品推荐

