PR のラベルの追加をトリガーに GitHub Actions を実行する
やりたいこと
GitHub Actions でブランチの push をトリガーに CI を実行すると、push 回数に比例して実行時間が増え続ける。できるだけ節約したい。
(コミットメッセージに [skip ci] のような文字を含めて実行をスキップすることはできる。)
pull_request: review_requested をトリガーにしばらく運用していたが、レビューをお願いするタイミング以外で CI を実行したくなるケースが増えてきた。
そのため他のトリガーで CI を実行できないか検討したところ、ラベルの追加がちょうど良さそうだったのでこれで実装することにした。
参考
GitHub Actions でラベルを扱う - Zenn
試したけどやめたこと
PR に /ci とコメントすると CI が走る実装を行ったが、PR のコメントは Issue のコメントと同じ扱いらしく、
PR 関連のブランチ名 (github.base_ref, github.head_ref) が容易に取得できない
Pull Request Comment Branch · Actions · GitHub Marketplace を使えば実現できる
PR に CI のステータスが反映されない, 最新のコミットにチェックマークがつかない
などの不便があったので、やめることにした。
試したい方は以下の Discussion を参考にしてほしい。
Trigger a github workflow if it matches a particular comment in the Pull Request · community · Discussion #25389
作成したワークフロー
code: .github/workflows/ci.yml
name: CI
on:
pull_request:
- labeled
jobs:
preprocess:
runs-on: ubuntu-latest
# needs CI というラベルを追加したときだけ CI を実行する
if: github.event.label.name == 'needs CI'
steps:
# .git/ がないと GitHub CLI がリポジトリを判別できない
# checkout せずに環境変数を設定すればどうにかできそうではある
- name: Checkout repo
uses: actions/checkout@v4
with:
ref: ${{ github.head_ref }}
- name: Remove triggered labels
if: github.event.label
env:
GH_TOKEN: ${{ github.token }}
run: |
gh pr edit ${{ github.event.number }} --remove-label "${{ github.event.labal.name }}"
test:
runs-on: ubuntu-latest
needs: preprocess
steps:
- name: Checkout repo
uses: actions/checkout@v4
with:
ref: ${{ github.head_ref }}
- ...
PR にワークフローの実行状況も反映されるし、最後のコミットにチェックマークもつく。いい感じ。
あとがき
トリガーしたイベントの Webhook のペイロードが GitHub コンテキスト (github.*) に格納されて、それを利用して条件を組み立てる感覚を掴むのに少し時間がかかった。
慣れないうちは echo ${{ github }} して中身を覗きながらデバッグするのがいいかもしれない。(できるのか?)
#技術系_TIPS #2024-04