GitHub Actionsでコードレビュー支援1(Labeler)

AvatarPosted by

この記事は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 Actionsの課金について

ディレクトリー構成

└─.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が実行されてしまい、無駄な時間がかかってしまいます。

concurrencycancel-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-labelsfalseにすると、ラベルの追加のみ。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があるので、色々試して見るのも面白いと思います。