[GitHub Actions]Draft Pull RequestでのCI無効化方法

kotayagi
The Finatext Tech Blog
8 min readApr 3, 2023

--

Photo by Richy Great on Unsplash

💡はじめに

こんにちは、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

--

--