GitHub ステータスはCircleCIのジョブが対象だが、ワークフロー単位で指定したい

モチベーション

tokizuoh.hatenablog.com

先日の登壇時のQandAタイムで頂いたコメントに整理がついたのでまとめておく。

頂いたコメント

ここはRerunさせなくてもワークフロー内のジョブの requires 句に指定すれば1回の実行で済んでRerunさせる必要はなくなりそう?つまり以下の感じ。

workflows:
  ios-workflow:
    jobs:
      - ios-test-job
      - workflow-status-check-job:
          requires:
            - ios-test-job

コメントを受けて

頂いたコメントは間違いない。ただ、自分のコードは思想が紛れていて上記のように修正しても期待した結果は得られない。以下の思想のパターンがあると思っていて自分は後者であることが分かった。その場合スライドの手法が上手くいく。

  • GitHub ステータスのRequiredに指定したジョブが成功していればOK
  • GitHub ステータスのRequiredに指定したジョブを含むワークフローが成功していればOK

前者の方が対応関係が明確。後者は対応関係が非直感的だがより安全にマージするためにワークフロー単位でグリーンorレッドを判断する。

思想

"GitHub ステータスはCircleCIのジョブが対象。けどジョブの上位存在であるワークフローが成功したかどうかをGitHub ステータスとして機能させたい" というのが個人の思想。例えば、GitHub ステータスのRequiredに指定したジョブ自体は成功でも、前後のジョブで失敗したら果たしてそれは安全にマージできる状態なのか?もっとも、マージ前にグリーンでありたいワークフローのジョブすべてにRequiredをつけるのも案だとは思うが冗長な気がする。対応策として、Requiredに指定したジョブを含むワークフロー自体がグリーンになったら状態確認用ジョブ(スライド中の workflow-status-check-job )をグリーンにする。

どこに関心があるか

自分はワークフロー単位でGitHub ステータスのRequiredを指定したい。なぜならジョブ単体の実行結果にさほど興味はなく(差はあれど)、ジョブの集合体であるワークフローの実行結果にのみ関心があるからだ。Requiredに指定したテストの後処理で失敗してたら気になるのでマージしたくない、みたいな気持ち。