You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 16:52:48