GitHub Actions如何获取失败作业列表并在自定义Slack消息中展示
GitHub Actions 前置失败作业识别Slack通知实现方案
核心依赖GitHub Actions内置的needs上下文获取所有依赖作业的执行状态,不需要额外引入第三方Action,即可实现单/多失败作业的自动识别拼接。
推荐实现(自动适配依赖作业变更,零后续维护)
直接修改你的reportFailure作业配置,在发送Slack通知前增加一个消息生成步骤,自动遍历所有依赖作业筛选失败项,拼接为目标格式的消息:
reportFailure: name: Slack notification needs: [ dependencies-vulnerabilities, image-vulnerabilities ] if: ${{ failure() }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Generate failure notification content id: gen_msg run: | failed_jobs=() # 自动遍历needs中声明的所有依赖作业,筛选执行失败的项 needs_json='${{ toJson(needs) }}' for job_id in $(echo "$needs_json" | jq -r 'keys[]'); do job_result=$(echo "$needs_json" | jq -r --arg jid "$job_id" '.[$jid].result') if [ "$job_result" = "failure" ]; then failed_jobs+=("$job_id") fi done # 拼接为逗号分隔的失败作业字符串 failed_list=$(IFS=', ' ; echo "${failed_jobs[*]}") # 生成符合要求的消息文本,写入步骤输出 echo "content=Workflow: ${{ github.workflow }} | Jobs: ${failed_list} failed!!" >> $GITHUB_OUTPUT - name: Slack notification uses: rtCamp/action-slack-notify@v2 env: SLACK_CHANNEL: my-channel SLACK_COLOR: '#ff0000' SLACK_ICON: https://library.kissclipart.com/20181123/hqe/kissclipart-mail-error-icon-clipart-computer-icons-email-0b0e6595c8731682.jpg SLACK_TITLE: ${{ github.repository }} SLACK_MESSAGE: ${{ steps.gen_msg.outputs.content }} SLACK_USERNAME: workflowBot MSG_MINIMAL: actions url,commit SLACK_FOOTER: '' SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
实现说明
- 该方案使用ubuntu-latest runner预装的
jq工具解析needs上下文的JSON结构,后续新增依赖作业时,只需要把新作业id加入needs数组即可,不需要修改消息生成逻辑,会自动识别新作业的失败状态。 - 单个作业失败时会自动输出单个作业名,多个作业失败时会用逗号拼接所有失败作业名,完全匹配你要求的展示格式。
- 如果你配置了作业的
name字段(显示名),想要通知里展示显示名而非yaml里的job_id,只需要把拼接逻辑里的$job_id替换为$(echo "$needs_json" | jq -r --arg jid "$job_id" '.[$jid].name')即可。
轻量实现(无jq依赖,适合固定依赖作业场景)
如果你的依赖作业数量固定不会频繁变更,也可以不用jq,直接手动遍历指定作业id,兼容性更强:
- name: Generate failure notification content id: gen_msg run: | failed_jobs=() # 手动列出所有依赖作业id即可 for job_id in dependencies-vulnerabilities image-vulnerabilities; do if [ "${{ needs[job_id].result }}" = "failure" ]; then failed_jobs+=("$job_id") fi done failed_list=$(IFS=', ' ; echo "${failed_jobs[*]}") echo "content=Workflow: ${{ github.workflow }} | Jobs: ${failed_list} failed!!" >> $GITHUB_OUTPUT
后续新增依赖作业时,同步把作业id加到for循环的列表里即可。
内容的提问来源于stack exchange,提问作者user16269092
相关产品推荐
相关产品推荐

