📘
GitHub Actionsのワークフローがお粗末だったので直したメモ
モチベーション
半年くらい前によく分からないまま自分で組んだCIがとても良くない感じのままメンテせずに放置していたのでお手入れをしたので、その時の作業メモを公開します。
やりたいこと
- PRが作られた時とリモートブランチに変更がpushされた時にテストを実行
- 特定のブランチ(mainとdev)にPRがマージされたらdeployを実行
修正前のyml
test_build_deploy.yml
という一枚のymlでやりたいことをまとめてやろうとして以下のような形になっていました。
on:
push:
pull_request:
branches: [main,dev]
types: [opened, edited, closed, reopened]
jobs:
test:
runs-on: ubuntu-latest
if: github.event.pull_request.merged == false
build:
runs-on: ubuntu-latest
if: github.event.pull_request.merged == true
deploy:
runs-on: ubuntu-latest
needs: build
お粗末ポイント
- PRを作るとpushとpull_request.opendを同時に検知して初回だけテストが2回キックされる
- mergeを検知するためにpull_request.closedを設定しなければいけないが、マージせずにPRを閉じた時にもテストがキックされる
- PRをmergeするとdeployと同時にtestもキックされる
pushとPRを同時に検知して同じjobが2回走る
お粗末ポイントの1と2は以下のようにして解決しました
- 誤 : 一つのymlでやろうとしていた。
test_build_deploy.yml
のワークフローをトリガーするイベントは以下のようになっていました。
on:
push:
pull_request:
types: [opened, reopened]
- 正:無理せずにファイルを分割する。
テスト実行用の設定をtest.yml
として用意し、pushをトリガーとします。
on:
push:
デプロイ用の設定をdeploy.yml
として用意し、PRのclosedをトリガーとします。
on:
pull_request:
branches: [dev, main]
types: [closed]
deployだけ走ってほしい時にtestも走ってしまう
お粗末ポイント3についてはファイルを分けただけではまだ不十分でした。PRをマージするとマージコミットのプッシュを検知してdeploy.ymlとtest.ymlが同時に走るのでbranch-ignore
で回避しました。
test.yml
on:
push:
branches-ignore:
- "main"
- "dev"
deploy.yml
on:
pull_request:
branches: [dev, main]
types: [closed]
baseとheadがどっちがどっちか分からん
比較ブランチ(compare)
github.head_ref
I
Discussion