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

如何在GitHub Workflow中获取失败作业的名称?

自动捕获GitHub Actions失败作业与步骤的方案

要实现无需手动硬编码作业ID、自动识别失败作业及步骤的通知功能,你可以借助GitHub API配合GitHub CLI或官方的actions/github-script来完成,新增作业/步骤时无需修改通知逻辑。

方案一:使用GitHub CLI + jq(轻量快速)

这种方式适合简单场景,利用GitHub官方CLI工具拉取工作流运行数据,用jq过滤失败项:

jobs:
  # 你的其他作业:build、test、deploy等
  notify-on-failure:
    runs-on: ubuntu-latest
    if: failure() # 仅在其他环节失败时触发
    steps:
      - name: 获取失败的作业与步骤详情
        id: fetch_failures
        run: |
          # 拉取当前工作流的所有作业数据
          job_data=$(gh api /repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/jobs)
          
          # 过滤出所有失败的作业
          failed_jobs=$(echo "$job_data" | jq -r '.jobs[] | select(.conclusion == "failure") | "\(.name)|\(.id)"')
          
          failure_details=""
          # 遍历每个失败作业,拉取其步骤数据
          while IFS="|" read -r job_name job_id; do
            failure_details+="\n### 失败作业:$job_name\n"
            
            # 拉取该作业的步骤详情
            step_data=$(gh api /repos/${{ github.repository }}/actions/jobs/$job_id/steps)
            # 过滤出失败的步骤
            failed_steps=$(echo "$step_data" | jq -r '.steps[] | select(.conclusion == "failure") | "- \(.name)"')
            
            if [ -n "$failed_steps" ]; then
              failure_details+="$failed_steps"
            else
              failure_details+="- 未检测到明确失败步骤(作业整体执行失败)"
            fi
          done <<< "$failed_jobs"
          
          # 将结果存入GitHub输出变量,供后续通知步骤使用
          echo "failure_details<<EOF" >> "$GITHUB_OUTPUT"
          echo -e "$failure_details" >> "$GITHUB_OUTPUT"
          echo "EOF" >> "$GITHUB_OUTPUT"
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # 默认拥有读取工作流数据的权限

      - name: 发送失败通知
        run: |
          # 这里替换为你的通知逻辑,比如调用Slack机器人、发送邮件等
          echo "工作流运行失败,详情如下:"
          echo -e "${{ steps.fetch_failures.outputs.failure_details }}"

注意事项:

  • Ubuntu-latest环境默认预装了jq和GitHub CLI,若使用其他运行环境,需手动安装这两个工具。
  • GITHUB_TOKEN默认具备读取当前仓库工作流数据的权限,无需额外配置。

方案二:使用GitHub Script(更灵活)

如果需要更复杂的逻辑处理,推荐使用官方的actions/github-script,用JavaScript直接调用GitHub API:

jobs:
  notify-on-failure:
    runs-on: ubuntu-latest
    if: failure()
    steps:
      - name: 抓取失败作业与步骤
        id: get_failures
        uses: actions/github-script@v6
        with:
          script: |
            // 拉取当前工作流的所有作业
            const { data: jobs } = await github.rest.actions.listJobsForWorkflowRun({
              owner: context.repo.owner,
              repo: context.repo.repo,
              run_id: context.runId
            });
            
            let failureDetails = '';
            // 遍历作业,筛选失败项
            for (const job of jobs.jobs) {
              if (job.conclusion === 'failure') {
                failureDetails += `\n### 失败作业:${job.name}`;
                
                // 拉取该作业的步骤数据
                const { data: steps } = await github.rest.actions.getJobSteps({
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  job_id: job.id
                });
                
                // 筛选失败的步骤
                const failedSteps = steps.steps.filter(step => step.conclusion === 'failure');
                if (failedSteps.length > 0) {
                  failureDetails += '\n' + failedSteps.map(step => `- ${step.name}`).join('\n');
                } else {
                  failureDetails += '\n- 未检测到明确失败步骤(作业整体执行失败)';
                }
              }
            }
            
            // 将结果存入输出变量
            core.setOutput('failure_details', failureDetails);

      - name: 发送通知
        run: |
          # 替换为你的通知实现,比如发送到企业微信、邮件等
          echo "工作流失败通知:"
          echo -e "${{ steps.get_failures.outputs.failure_details }}"

优势:

  • 无需依赖外部工具(如jq),逻辑更易维护和扩展。
  • 官方Action兼容性更好,不易因环境变化出问题。

这两种方案都能自动识别工作流中所有失败的作业和步骤,新增作业/步骤时无需修改通知环节的代码,完全满足你的需求。

内容的提问来源于stack exchange,提问作者Tobias Berger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 22:21:06