📘

GitHub Actionsのワークフローがお粗末だったので直したメモ

2021/08/22に公開

モチベーション

半年くらい前によく分からないまま自分で組んだCIがとても良くない感じのままメンテせずに放置していたのでお手入れをしたので、その時の作業メモを公開します。

やりたいこと

  1. PRが作られた時とリモートブランチに変更がpushされた時にテストを実行
  2. 特定のブランチ(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

お粗末ポイント

  1. PRを作るとpushとpull_request.opendを同時に検知して初回だけテストが2回キックされる
  2. mergeを検知するためにpull_request.closedを設定しなければいけないが、マージせずにPRを閉じた時にもテストがキックされる
  3. 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がどっちがどっちか分からん

Image from Gyazo
ベースブランチ(base)
github.base_ref

比較ブランチ(compare)
github.head_ref
I

Discussion