Pull Request に付与できる Labels を制御の分岐に利用します。main マージ時の分岐にも利用できます
Folklore (このホームページ) では、GitHub Actions でビルドとデプロイを行なっています
その際 PR (Pull Request) のラベルの付与状態により、デプロイを行うかどうか判別しています
デプロイ自体は、以下のタイミングで行われるのですが...
デプロイトリガー
PR 起票時・再 Push 時 → ステージング環境にデプロイ
main ブランチ (デフォルトブランチ) マージ時 → 本番環境にデプロイ
いずれもデプロイして確認したり更新する必要がない場合もあり、少しでも Actions の時間節約に利用しています
平常時はデプロイしますが、このようなラベルが付与されている場合は、デプロイをキャンセルします
ラベルの付与状況
no-staging-deploy → ステージング環境のデプロイを行わない
no-production-deploy → 本番環境のデプロイを行わない
ここでは以上のラベル名を使っていますが、適宜読み替えてください
トリガーが PR に依存しているか否かで、制御の書き方が異なります
トリガーが PR に依存している場合は、以下のようにして簡潔に分岐を作ることができます
if ブロックで条件を書けるので、GitHub Actions の利用時間に加算されません
name: Staging Deploy by Push triggeron:pull_request:types: [opened, synchronize]jobs:deploy:runs-on: ubuntu-latestif: |((github.event.action == 'opened') &&!contains(github.event.pull_request.labels.*.name, 'no-staging-deploy')) ||((github.event.action == 'synchronize') &&!contains(github.event.pull_request.labels.*.name, 'no-staging-deploy'))steps:- name: Deployrun: |echo "Deploy"
おまけですが、途中でラベルの付与が外されてもデプロイしたい場合は、以下のように用意しておくこともできます
name: Staging Deploy by Label change triggeron:pull_request:types: [unlabeled]jobs:deploy:runs-on: ubuntu-latestif: |(github.event.action == 'unlabeled') &&(github.event.label.name == 'no-staging-deploy')steps:- name: Deployrun: |echo "Deploy"
これは PR のトリガーに依存しないため PR のラベルを簡単に取得することができず、若干複雑です
判定にマシンを利用するため GitHub Actions の利用時間に加算されます
コミットメッセージの PR 番号を利用するため PR がマージされる時に自動で生成されるメッセージである必要があります
Merge pull request #1 from user/branchPR からデフォルトブランチにマージするルールの運用のもとでは問題ないかと思います
name: Production Deployon:push:branches:- mainjobs:check_labels:runs-on: ubuntu-latestpermissions:pull-requests: readsteps:- name: Get the merged PR Numberid: prrun: |if [[ '${{ github.event.head_commit.message }}' =~ Merge\ pull\ request\ \#([0-9]+) ]]; thenecho "number=${BASH_REMATCH[1]}" >> $GITHUB_OUTPUTelseecho 'PR Number not found in the commit message.'exit 1fishell: bash- name: Check the PR labelsid: check-labelsrun: |LABELS=$(curl --silent --show-error --header "Authorization: Bearer ${{ github.token }}" \https://api.github.com/repos/${{ github.repository }}/issues/${{ steps.pr.outputs.number }}/labels | \jq -r '.[].name')if echo "$LABELS" | grep -q "no-production-deploy"; thenecho "skip=true" >> $GITHUB_OUTPUTelseecho "skip=false" >> $GITHUB_OUTPUTfishell: bash- name: Deployif: steps.check-labels.outputs.skip != 'true'run: |echo "Deploy"
これで PR のラベルを元に Actions の挙動を変更することができます 🎉
(追記) 元々掲載していた Actions について
おわりに
GitHub Actions の制御を動的に設定できるので、とても汎用性が高そうです 🍭
もっと色々な使い方を模索してみたいです 🐶
(ちなみにおおまかなラベル取得方法は、GitHub Copilot に教えてもらいました。強い...)