この記事はGRIPHONE Advent Calendar 2022 2日目の記事です。
こんにちは、サーバーサイドエンジニアのtackです。
弊社ではGitHubのプルリクエストでコードレビューをしているのですが、時間がかかり大変なのと、見逃しも結構あります。
そこで、GitHub Actionsを使い、少しでもプルリクエストのレビューコストを下げられないか試して見たので、紹介します。
※今回は2記事構成で、1記事目となります。
Marketplace
GitHubにはMarketplaceがあり、たくさんの便利なActionを探すことができます。MarketplaceにあるActionを使う事で、自分で1から作る時間を節約することができます。
※Marketplaceには情報漏洩につながる悪質なものもある可能性があるので、注意しましょう。作成者が認証済みの物を使う、starが多い物を使う、ソースコードを確認するようにしてください。
Labeler
今回は、プルリクエストのレビューに使えそうなLabelerを紹介します。
Labelerはプルリクエストで、指定したファイルに変更があった場合にプルリクエストにラベルを付けるActionです。
例えば、migration
ファイルに差分があったら、maigration
ラベルを付ける。package.json
に変更があったら、package_updated
ラベルを付ける。といった感じに使う事ができます。
これにより、注意して確認しないといけないプルリクエストに気づくことができます。
GitHub Actionsの作り方
リポジトリーのルートディレクトリーに.github/workflows
ディレクトリーを作り、その中にActionを定義したymlファイルを作るだけで、様々な機能を作る事ができます。
無限に実行できるわけでは無く、無料枠の実行時間が決められていて、それを超えた場合は有料となります。
ディレクトリー構成
└─.github
├─workflows
│ └─label.yml (GitHub Actionsの構成ファイル)
└─labeler.yml (labeler用の設定ファイル)
label.ymlの内容
name: Labeler
on:
pull_request:
types:
- opened
- synchronize
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
label:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/labeler@v4
with:
repo-token: "${{ secrets.GITHUB_TOKEN }}"
sync-labels: true
on(Events)
on:
pull_request:
types:
- opened
- synchronize
on
でJobsが実行されるトリガー条件(Events)を指定することができます。
今回はプルリクエストを新しく作ったとき(opened
)と、プルリクエストを作ったブランチに新しくプッシュされたとき(synchronize
)に実行されるトリガーにしています。
トリガーには複数の条件を設定することができ、OR条件で動きます。
pull_request
以外にもたくさんトリガーがあるので、詳しくは公式リファレンスを参照してください。
concurrency
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
concurrency
(同時実行制御)を書くことで、同じジョブが重複したときの処理を制御する事ができます。
例えば、プルリクエストのsynchronize
をトリガーにしている場合、短い期間で2回プッシュされると、2回Actionが実行されてしまい、無駄な時間がかかってしまいます。
concurrency
でcancel-in-progress
を設定trueにすると、同じジョブが既に実行されている場合、そのジョブをキャンセルしてから、新しいジョブを実行してくれます。
jobs
実行するジョブを定義するjobs
ブロックです。
jobs:
label:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/labeler@v4
with:
repo-token: "${{ secrets.GITHUB_TOKEN }}"
sync-labels: true
label
というのはjob名で好きな名前を設定できます。jobは複数作る事ができます。
runs-on
runs-on: ubuntu-latest
ジョブを実行するための環境を指定します。特にこだわりが無ければ、ubuntu-latest
で大丈夫です。ubuntu以外にwindowsなどもあります。
timeout-minutes
timeout-minutes: 5
ジョブの最大実行時間を指定します。無限ループなどでジョブが長時間実行されてしまい、無駄な料金を取られるのを防ぐ事ができます。
steps
ジョブの処理を定義するブロックです。複数のジョブを書くことができます。
このブロックの書き方はMarketplaceに書かれている例を参考に書いていきます。
Labelerの場合は次のようになります。
- uses: actions/labeler@v4
with:
repo-token: "${{ secrets.GITHUB_TOKEN }}"
sync-labels: true
${{ secrets.GITHUB_TOKEN }}
の部分はActionを実行すると、自動的にGitHubのアクセストークンに置換されるので、手動でアクセストークンを発行する必要はありません。このまま使って下さい。
sync-labels
はfalse
にすると、ラベルの追加のみ。true
にすると追加と削除を行います。例えば、true
の場合、ラベルをつけるコミットをリバートすると、ラベルも削除されます。
labeler.ymlの内容
このファイルでどのファイルに変更があったら、どのラベルをつけるかの設定を書きます。
ラベル名をキーにした配列にパスを追加していきます。パスの指定はglobパターンを使えます。
例:migrationディレクトリー内のjsファイルに変更があったら、migrationラベルをつけたい場合
migration:
- src/migration/*.js
例:package.jsonに変更があったら、package_updatedラベルをつけたい場合
package_updated:
- package.json
詳しい書き方は公式の解説をご覧下さい。
最後に
GitHub Actionsについて簡単に解説と、Labelerの使い方を紹介しました。MarketplaceにはたくさんActionがあるので、色々試して見るのも面白いと思います。