如何在GitHub Actions工作流中检测作业是否被手动驳回?
区分手动驳回与作业执行失败的实现方法
要在GitHub Actions工作流中区分手动驳回审批作业和作业执行错误导致的失败,可以通过以下两种实用方式实现:
方法一:通过GitHub API查询作业原因
使用actions/github-script调用GitHub API,获取目标作业的详细信息,判断失败是否由手动审批驳回触发:
jobs: notify-on-failure: runs-on: ubuntu-latest if: ${{ failure() }} steps: - name: 检查是否为手动驳回导致的失败 id: check_rejection uses: actions/github-script@v6 with: script: | const runId = context.runId; // 调用API获取当前工作流的所有作业 const jobs = await github.rest.actions.listJobsForWorkflowRun({ owner: context.repo.owner, repo: context.repo.repo, run_id: runId }); // 筛选出失败的作业 const failedJobs = jobs.data.jobs.filter(job => job.conclusion === 'failure'); // 判断是否存在手动驳回的作业(无执行步骤/匹配审批作业名称) const isManualRejection = failedJobs.some(job => job.steps.length === 0 || job.name.includes('审批') // 根据你的审批作业名称调整 ); core.setOutput('is_manual_rejection', isManualRejection); - name: 发送Slack通知(仅作业执行错误时) if: ${{ steps.check_rejection.outputs.is_manual_rejection == 'false' }} uses: slackapi/slack-github-action@v1.24.0 with: slack-message: "作业执行失败,请检查!" env: SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
方法二:利用作业上下文标记审批状态
如果你的审批是基于environment的环境审批,可以在审批通过后设置输出标记,后续作业通过该标记判断失败类型:
jobs: approval: runs-on: ubuntu-latest environment: production steps: - name: 标记审批通过 id: mark_approval run: echo "approved=true" >> $GITHUB_OUTPUT deploy: runs-on: ubuntu-latest needs: approval steps: - name: 执行部署 run: # 你的部署命令 notify: runs-on: ubuntu-latest needs: [approval, deploy] if: ${{ failure() }} steps: - name: 判断失败类型 id: check_failure_type run: | # 若审批作业无approved输出,说明是被手动驳回 if [ -z "${{ needs.approval.outputs.approved }}" ]; then echo "is_manual_rejection=true" >> $GITHUB_OUTPUT else echo "is_manual_rejection=false" >> $GITHUB_OUTPUT fi - name: 发送Slack通知(仅执行错误) if: ${{ steps.check_failure_type.outputs.is_manual_rejection == 'false' }} uses: slackapi/slack-github-action@v1.24.0 with: slack-message: "部署作业执行失败,请排查!" env: SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
核心逻辑说明
- 手动驳回的审批作业通常不会执行任何步骤,因此
steps.length为0,也可以直接匹配审批作业的名称来识别。 - API查询方式通用性更强,适合各类手动审批场景;上下文标记方式更轻量,适合简单的环境审批流程。
内容的提问来源于stack exchange,提问作者excelsiorious
相关产品推荐
相关产品推荐

