如何在同一GitHub Workflow中实现Job间自动触发(含环境审批)
解决方案
步骤1:调整Matrix依赖关系,实现Job串行执行
首先修改createloopmatrix job中的PowerShell脚本,为每个Matrix条目添加前一个Job的依赖名称,让两个Job按顺序串行触发:
$color = "hello, yellow" $values = $color.Split(',').Trim() # 移除空格避免Job名称带无效空格 $matrix = @() $envVars = @{} $previousJobName = "createloopmatrix" # 第一个Job依赖矩阵生成Job foreach ($value in $values) { $matrixName = "MA_$value" $matrix += @{ "DISPLAYLIST" = $matrixName; "CUSTOMENVNAME" = $value; "DEPENDENTNAME" = $previousJobName } $envVars."$value" = $value Write-Output "Value: $value" $previousJobName = $matrixName # 更新为当前Job名称,作为下一个Job的依赖 } echo "MATRIX=$($matrix | ConvertTo-Json -Compress -Depth 100)" >> "$env:GITHUB_OUTPUT" echo "ENV-VARS=$($envVars | ConvertTo-Json -Compress -Depth 100)" >> "$env:GITHUB_OUTPUT"
修改后,Trigger_Service的needs字段会正确关联前一个Job,MA_yellow只会在MA_hello执行完成后才会进入待触发状态。
步骤2:实现第二个Job的自动审批
GitHub环境审批默认需要手动批准每个环境的部署,要让MA_yellow自动执行,有两种可行方式:
方式A:调整环境审批规则(推荐)
如果hello和yellow环境的审批人员相同,可直接为yellow环境设置豁免规则:
- 进入仓库的Settings > Environments,找到
yellow环境 - 编辑部署保护规则,在Required reviewers中添加允许自动批准的人员/团队;或设置Allow deployments from specific branches(如果触发分支固定为
main) - 若支持,启用Skip deployments if previously approved选项,允许同一工作流运行中已批准的情况下跳过审批
方式B:用GitHub API自动批准部署请求
在MA_hello的Job中添加步骤,完成后调用GitHub API自动批准MA_yellow的部署请求:
steps: - name: Split Matrix name for use run: | Write-Host "Inside Matrix" - name: Auto-approve next job deployment if: matrix.DISPLAYLIST == 'MA_hello' env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} REPO: ${{ github.repository }} RUN_ID: ${{ github.run_id }} run: | # 获取待审批的yellow环境部署ID DEPLOYMENT_ID=$(gh api repos/$REPO/actions/runs/$RUN_ID/pending_deployments --jq '.[] | select(.environment_name == "yellow") | .id') # 自动批准部署 if [ -n "$DEPLOYMENT_ID" ]; then gh api --method POST repos/$REPO/actions/deployments/$DEPLOYMENT_ID/reviews -f state="approved" -f comment="Auto-approved after MA_hello completion" fi
默认的GITHUB_TOKEN已包含deployments:write权限,无需额外配置。
最终完整Workflow代码
name: NEW Loop Over Comma-Separated Values on: push: branches: - main jobs: createloopmatrix: runs-on: windows-latest outputs: MATRIX: ${{ steps.set-matrix.outputs.MATRIX }} ENV-VARS: ${{ steps.set-matrix.outputs.ENV-VARS }} steps: - name: Run PowerShell id: set-matrix shell: pwsh run: | $color = "hello, yellow" $values = $color.Split(',').Trim() $matrix = @() $envVars = @{} $previousJobName = "createloopmatrix" foreach ($value in $values) { $matrixName = "MA_$value" $matrix += @{ "DISPLAYLIST" = $matrixName; "CUSTOMENVNAME" = $value; "DEPENDENTNAME" = $previousJobName } $envVars."$value" = $value Write-Output "Value: $value" $previousJobName = $matrixName } echo "MATRIX=$($matrix | ConvertTo-Json -Compress -Depth 100)" >> "$env:GITHUB_OUTPUT" echo "ENV-VARS=$($envVars | ConvertTo-Json -Compress -Depth 100)" >> "$env:GITHUB_OUTPUT" Trigger_Service: name: ${{ matrix.DISPLAYLIST }} needs: ${{ matrix.DEPENDENTNAME }} runs-on: windows-latest strategy: matrix: include: ${{ fromJson(needs.createloopmatrix.outputs.MATRIX) }} environment: name: ${{ matrix.CUSTOMENVNAME }} steps: - name: Split Matrix name for use run: | Write-Host "Inside Matrix" - name: Auto-approve next job deployment if: matrix.DISPLAYLIST == 'MA_hello' env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} REPO: ${{ github.repository }} RUN_ID: ${{ github.run_id }} run: | DEPLOYMENT_ID=$(gh api repos/$REPO/actions/runs/$RUN_ID/pending_deployments --jq '.[] | select(.environment_name == "yellow") | .id') if [ -n "$DEPLOYMENT_ID" ]; then gh api --method POST repos/$REPO/actions/deployments/$DEPLOYMENT_ID/reviews -f state="approved" -f comment="Auto-approved after MA_hello completion" fi
内容的提问来源于stack exchange,提问作者Ashar
相关产品推荐
相关产品推荐

