[GitHub Actions]Draft Pull RequestでのCI無効化方法
💡はじめに
こんにちは、Finatextグループでサーバーサイドエンジニアの長期インターンをしている@88888888_kotaです。
インターンでは、「Goal Navi」という投資一任運用サービスのバックエンド開発に携わっています。
先日、migrationファイルに変更があった際にDB schema documentを修正するCIを実装しました。そこで、PRを一旦Draft状態で上げたのですが、CIが回るような設定になっていました。
Draft Pull Request(以下、Draft PR)を用いたコード共有は一般的ですが、特別な設定をしない限りCIが回ってしまいます。Draft PRはWIP(作業中)であることを示すために使われることが多く、その場合、CIが回ることはコスト面で無駄になります。また、Draft PRを作成した際に複数のCIが回ってしまうと「とりあえずDraft PRでコード共有して実装の方向性を確認する」といったようなフローを気軽に行うことが難しくなり、そのせいで出戻りが発生しうることもあるかと思います。
そこで、コスト削減目的だけでなくPRのハードルを下げる目的で、Draft PRでのCI無効化をチームに提案し、実装を行いました。
この記事では、その実装方法について説明します。
🛠 実装
検証及び説明
まず、下記ファイルの挙動について説明します。
on:
push:
branches:
- main
pull_request:
jobs:
echo:
runs-on: ubuntu-latest
steps:
- name: Greeting
run: echo "Hello World"
- name: Greeting
run: echo "Goodbye World"
1. 単純にDraft PRを上げてみると、以下のようにCI(on.pull_request)が実行されます。
2. 上記の状態からReady for reviewにしてみるとその瞬間はCIは実行されません。
3. 適当にcommitしてみるとCI(on.pull_request)が実行されます。
4. mergeするとCI(on.push)が実行されます。
というのが現状のコードでの挙動です。
最終的に期待する挙動としては以下になります。
- 1の場合はCIは実行ない
- 2, 3, 4の場合にのみCIが実行される
次に、トリガーにready_for_reviewを追加してみます。
on:
push:
branches:
- main
pull_request:
types:
- ready_for_review # 追記
jobs:
echo:
runs-on: ubuntu-latest
steps:
- name: Greeting
run: echo "Hello World"
- name: Greeting
run: echo "Goodbye World"
1. 単純にDraft PRを上げてみると、以下のようにCIが実行されません。(期待通り)
2. 上記の状態からReady for reviewにしてみると、その瞬間はCI(on.pull_request)は実行されます。(期待通り)
3. 適当にcommitしてみるとCIが実行されません。(ダメ)
4. mergeするとCI(on.push)が実行されます。(期待通り)
結果、このコードだと、
- Draft→Ready for reviewに変更した時のみCIが回る
- Ready for reviewに変更後commitしてもCI回らない(ダメ)
となります。
そこでトリガーを修正し、さらにif: github.event.pull_request.draft == falseを追記します。
on:
push:
branches:
- main
pull_request:
types:
- opened # default
- reopened # default
- synchronize # default
- ready_for_review
jobs:
echo:
if: github.event.pull_request.draft == false # 追記
runs-on: ubuntu-latest
steps:
- name: Greeting
run: echo "Hello World"
- name: Greeting
run: echo "Goodbye World"
1. 単純にDraft PRを上げてみると、以下のようにCIがskipされます。(期待通り)
2. 上記の状態からReady for reviewにしてみるとその瞬間はCIは実行されます。(期待通り)
3. 適当にcommitしてみるとCI(on.pull_request)が実行されます。(期待通り)
4. mergeするとCI(on.push)が実行されます。(期待通り)
検証のまとめ
on:
pull_request:
types:
- ready_for_review
- draft→ready for reviewに変更した時のみCIが回る
- ready for reviewに変更後commitするとCIが回る
jobs:
[job name]:
if: github.event.pull_request.draft == false
- draft状態でPR送るとjobがスキップされる
- draft→ready for reviewに変更した瞬間はCI回らない
- ready for reviewに変更後commitするとCI回る
on:
pull_request:
types:
- opened # default
- reopened # default
- synchronize # default
- ready_for_review # 必要
jobs:
[job name]:
if: github.event.pull_request.draft == false # 必要
# some steps
- draft状態でPR送るとjobがスキップされる
- draft→ready for reviewに変更した瞬間はCI回る
- ready for reviewに変更後commitするとCI回る
🍀 補足
以上、Draft PRでCIを回さないようにする設定方法を検証コードと共に紹介させていただきました。
補足ですが、Draft PR時のCI無効化以外にも、以下のような設定はCIの稼働削減に効果的だと思われます。
- 特定のファイルやディレクトリが変更されたときのみ(pathsで対象を絞る)
- 特定のブランチに対してのみ(branchesを指定)
📢さいごに
Finatextグループでは、SaaS型金融基幹システムの大規模API開発に取り組んでいただけるエンジニアを募集しております!「組込型金融(エンベデッドファイナンス)」の実装を加速させ、「金融がもっと暮らしに寄り添う世の中」を一緒に実現しましょう!
▼Finatext開発チーム 採用情報
▼募集一覧(インターンも常時募集中です!)
▼カジュアル面談の応募フォーム
https://forms.gle/r69LwG3cLAjiGvY66