LoginSignup
5
1

More than 1 year has passed since last update.

[GitHub Actions]プルリクで動かすCIをon: pushで動かしていたらエラーを取りこぼしてマージしてしまった話

Last updated at Posted at 2021-09-30

GitHubを利用して開発する際、プルリクエストでCIを利用して様々なチェックを走らせることがあると思います。
私もGitHub Actionsを使ってプルリクにPushするたびに様々なチェックを走らせていたのですが、タイトルの通りエラーを取りこぼしてマージしてしまうことがありました。

状況再現

例えば下記の場合、fuga ciとhoge ciがコケているのでこのプルリクの修正で何か問題が発生したことを検知できます。

スクリーンショット 2021-09-30 10.05.57.png

説明のためかなり簡素化していますが、上記のプルリクでは下記のコードとそれをテストするGitHub Actionsを定義しています。

hoge/main.sh
#!/bin/bash

exit 1
fuga/main.sh
#!/bin/bash

exit 1
.github/workflows/hoge.yml
name: hoge ci

on:
  push:
    paths:
      - 'hoge/**'

jobs:
  hoge:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2.3.4
      - name: run hoge
        run: hoge/main.sh
.github/workflows/fuga.yml
name: fuga ci

on:
  push:
    paths:
      - 'fuga/**'

jobs:
  fuga:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2.3.4
      - name: run fuga
        run: fuga/main.sh

hoge ciはチェック内容がhoge/**のファイルに依存しているので、hoge配下のファイルが変更された時だけ実行します。
fuga ciも同様の理由でfuga配下のファイルが変更された時だけ実行します。

今回、hogeもfugaも不具合が埋め込まれたことを表現するためにexit 1としています。そのためCIがエラーになっています。

不具合(exit 1)を修正します。
今回はexit 0に直すだけなので両方一気に直せば良いですが、通常開発の場合、まずはhgoeだけ直すなど1つずつ修正していくことが多いと思います。
今回は最初にhogeだけ直してみます。
hoge/main.shが正常終了するように下記のようにexit 0に修正してpushします。

hoge/main.sh
#!/bin/bash

exit 0

pushした後、プルリクを確認してみると下記のようになりました。
「All checks have passed」
hoge/main.shしか修正しておらず、fuga/main.shの不具合は残ったままにもかかわらずCIが通ってしまいました。

allcheckshavepassed.png

よく見ると、「All checks have passed」の下のchecksにfuga ciが含まれていません。
プルリクのマージボタンの箇所に表示されるChecksの判定は最後に動作したChecksの結果が反映されます。
最後のPushではhoge/main.shしか修正していないため、hoge ciしか動作せず、動作したテストは全て正常終了したためCIがパスしたようです。

fuga/main.shに不具合が残ったままですが、このプルリクを見るとCIはパスしているように見えるのでマージしてしまいそうですよね。
冒頭で記載したエラーを取りこぼしたのはこの状況です。エラーがあることに気づかずマージしてしまい、mainブランチに不具合が混入してしまいました。

では、どのようにすればこの状況を避けられるのでしょうか?

解決策

タイトルに「on: pushで動かしていたらエラーを取りこぼした話」と書いた通り、on: pushの挙動に問題があります。

on: pushを使うと、Pushに含まれるコードをもとに該当するCIが実行されます。
先程の2回目のPushはhoge/main.shのみしか含まれていなかったため、hoge ciのみ実行されました。
この挙動によりfuga ciが実行されずに不具合を見逃してしまいました。

これを避けるためにはon: pull_requestを使用すればよいです。

Github Actionsのonをpull_requestに変更して同様の作業を行います。

.github/workflows/hoge.yml
name: hoge ci

on:
-  push:
+  pull_request:
    paths:
      - 'hoge/**'
.github/workflows/fuga.yml
name: fuga ci

on:
-  push:
+  pull_request:
    paths:
      - 'fuga/**'

実行結果は下記の通り。
スクリーンショット 2021-09-30 10.52.56.png

先ほどと異なり、hogeだけ修正したPushでもfuga ciも動作しています。
on: pull_requestはpushと異なりpull_requestに含まれるコードをもとに該当するCIが実行されます。
そのため、最後のPushにfuga/main.shが含まれていなくても、プルリク全体で見ると含まれているためfuga ciも実行されます。

これであればhoge ciがコケていることが一目瞭然なので誤ってマージしてしまうこともありません。

まとめ

上記の挙動より、プルリクエストのCIとして使う場合はon: pull_requestを使った方が良さそうです。
過去に私が書いた記事はon: pushになっているものが多いので修正しないとな・・・

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1