获取整个 Github Actions 工作流程的状态,而不仅仅是单个作业的状态

Seb*_*eld 6 github github-actions

我正在尝试从 Guthub Actions 工作流程向 slack 发送有关工作流程成功/失败的消息。

  finally:
    runs-on: ubuntu-latest
    needs: ['ci-build', 'lint-yaml', 'lint-json', 'lint-env-files', 'lint-folders', 'lint-filenames', 'shellcheck', 'lint-dockerfile']
    if: always()

    steps:
      - name: Send pipeline status to Slack
        if: always()
        uses: kpritam/slack-job-status-action@v1
        with:
          job-status: ${{ job.status }}
          slack-bot-token: ${{ secrets.SLACK_BOT_TOKEN }}
          channel: C0438TFQNPM # pipelines channel
Run Code Online (Sandbox Code Playgroud)

发送消息有效。但${{ job.status }}不代表整个pipeline的状态,只代表最后一个job。

如果任何作业中的任何步骤失败,我想发送失败消息。这是我用于测试的工作流程运行:https://github.com/sebastian-sommerfeld-io/docker-image-adoc-antora/actions/runs/3096876874

工作流程本身按预期工作。但我的松弛消息报告“成功”。它应该报告“失败”,因为一项作业失败,随后跳过另一项作业。

有人知道如何获取整个工作流程的状态,而不仅仅是 Github Actions 工作流程中的单个作业吗?

小智 5

通常可以通过使用关键字needs创建依赖树将作业“链接”在一起,而不是为每个失败(或成功)的作业发送通知。

为了保持逻辑分离,您可以添加一个最终作业来执行向 Slack 的通知,并且可以将其设置为对所有早期作业的依赖项。

最终作业可以使用类似${{ job.status == 'success' && needs.earlierjob1.result == 'success' && needs.earlierjob2.result == 'success' }表示总体成功的布尔值之类的东西来计算总体工作流程状态。needs.*.result通过使用而不是按名称列出每个作业,这可以变得更容易维护。

我在这里写了一篇更详细的文章,包括哪些有效、哪些无效的示例。

最后,我构建了一个本机 Slack 应用程序来自动处理此问题,因此您根本不需要考虑工作状态或通知。