如何在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
相关产品推荐
相关产品推荐

