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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:25:06