有什么方法可以确定工作流程中等待批准的作业是否被手动拒绝?我知道手动拒绝的作业现在具有
failure
状态,但这不是作业执行中的错误,如果我手动拒绝它,这是预期的行为(例如,我拒绝部署到生产环境的作业)。如果我需要将 Slack 通知作为最后一个作业发送,以防使用 if: ${{ failure() }}
条件的作业出现任何失败,它也会在之前的作业之一被手动拒绝时发送通知。
已找到此问题的解决方案。通过为需要手动批准/拒绝的作业设置输出参数,可以区分“真正失败”的作业和“被拒绝”的作业,然后在我们想要检查是否存在“真正失败”的下游作业中使用它在工作流程或作业中手动执行拒绝。
jobs:
job1:
runs-on: ubuntu-latest
environment: staging
outputs:
approved: ${{ steps.set-outputs.approved }}
steps:
- name: Set outputs
id: set-outputs
run: |
echo "approved=true" >> $GITHUB_OUTPUT
job2:
runs-on: ubuntu-latest
environment: prod
outputs:
approved: ${{ steps.set-outputs.approved }}
steps:
- name: Set outputs
id: set-outputs
run: |
echo "approved=true" >> $GITHUB_OUTPUT
notify-on-error:
runs-on: ubuntu-latest
if: ${{ failure() && github.event_name == 'push'
&& (needs.job1.result != 'failure' || (needs.job1.result == 'failure' && needs.job1.outputs.approved == 'true'))
&& (needs.job2.result != 'failure' || (needs.job2.result == 'failure' && needs.job2.outputs.approved == 'true')) }}
steps:
- name: Slack Notification
...
此配置效果很好,但不会涵盖以下情况:如果需要手动审批的作业被批准,然后在执行过程中失败,如果我们重新运行它并拒绝它,它将被视为失败的作业。它仅与重新运行相关,特别是通过单击带箭头的圆圈或通过“重新运行失败的作业”选项来重新运行此作业。对于“重新运行所有作业”选项,在这种情况下一切正常。