LoginSignup
1
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-10-26

この記事はこちらからの転載になります。

モチベーション

半年くらい前によく分からないまま自分で組んだ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のワークフローをトリガーするイベントは以下のようになっていました。
yml
on:
push:
pull_request:
types: [opened, reopened]

  • 正:無理せずにファイルを分割する。

テスト実行用の設定をtest.ymlとして用意し、pushをトリガーとします。
yml
on:
push:

デプロイ用の設定をdeploy.ymlとして用意し、PRのclosedをトリガーとします。
yml
on:
pull_request:
branches: [dev, main]
types: [closed]

deployだけ走ってほしい時にtestも走ってしまう

お粗末ポイント3についてはファイルを分けただけではまだ不十分でした。PRをマージするとマージコミットのプッシュを検知してdeploy.ymlとtest.ymlが同時に走るのでbranch-ignoreで回避しました。

test.yml
yml
on:
push:
branches-ignore:
- "main"
- "dev"

deploy.yml
yml
on:
pull_request:
branches: [dev, main]
types: [closed]

baseとheadがどっちがどっちか分からん

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

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

1
0
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
1
0