我有一个包含多个执行部署任务的作业的工作流程。我使用矩阵策略将它们部署在多个环境中,例如
dev
、tst
和 stg
。所以每个作业的策略配置如下
strategy:
matrix:
target_env: ${{ fromJson(needs.determine_target_env.outputs.target_env) }}
此外,如果部署的环境是 tst 或 stg,我需要有人来审查部署(开发人员不需要审查)。我在 GitHub 中创建了环境为
test-environment
和 stg-environment
并按如下方式使用它们
environment: >-
${{
matrix.target_env == 'tst' && 'test-environment' ||
matrix.target_env == 'stg' && 'stage-environment' ||
''
}}
这会触发批准,审核者可以批准/拒绝部署。这是这个问题:
由于我有几份工作,它一直要求所有工作都获得批准
如果我将环境移动到首先执行的单独作业(见下文),则无法捕获该拒绝或批准的输出,因为当被拒绝时,工作流程就会失败,并且如果我提供
continue-on-error
对于该工作,即使它被拒绝,它也会将其标记为 success
。
environment_approval:
needs: determine_target_env
runs-on: [default]
strategy:
matrix:
target_env: ${{ fromJson(needs.determine_target_env.outputs.target_env) }}
fail-fast: false
continue-on-error: true //If this is not set, rejections marks this job as failure. If it is set, the job is always a success.
outputs:
approval_status: ${{ steps.check_approval.outcome }}
environment: >-
${{
matrix.target_env == 'tst' && 'test-environment' ||
matrix.target_env == 'stg' && 'stage-environment' ||
''
}}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
fetch-depth: 0
- name: Check approval status
continue-on-error: true
id: check_approval
run: |
echo "status=success" >> $GITHUB_OUTPUT
是否有一种集中方式来处理部署保护并将其应用到工作流程中的所有作业?
我也尝试过使用
environment:
上下文我的方法是为每项工作设置正确的“如果”条件。
举个例子:
- name: Check approval status
if: matrix.target_env == '<env>'
continue-on-error: true
id: check_approval
run: |
echo "status=success" >> $GITHUB_OUTPUT