GitHub Actionsは非常に便利ですが、何かと歯がゆい部分もいくつかあります。
個人的にかなり困ったのが、ワークフローの動作確認がしづらいこと。
ワークフローのトリガーとなるイベントの一覧が こちら に掲載されていますが、その多くに「このイベントは、ワークフローのファイルがデフォルトブランチに配置されていないとワークフローをトリガーしない」という旨の注意書きがしてあります。
Issueやラベル、workflow_dispatchなんかがこれに該当します。
つまり、これらのイベントをトリガーとするワークフローに関しては、事前に動作確認をすることができないわけですね。
とはいえ、動くかどうかわからないワークフローをデフォルトブランチに混ぜ込むのはそれなりに抵抗があるものです。
GitHub Actionsをローカルで実行できる act もすばらしい選択肢のひとつですが、ちょいちょい GitHub Actionsと異なる挙動をすることがあることと、リポジトリのSecretやGitHub Environmentsの恩恵を受けようとすると設定が面倒だったり、残念ポイントも少なからずあります。
そこで、やや強引ではありますが、GitHub Actionsの「workflow_dispatchをトリガーとするワークフローのファイルがデフォルトブランチにある場合、別ブランチの同名ファイルのworkflow_dispatchをトリガーとするワークフローも実行できる」という仕様を利用して、デフォルトブランチ以外に置かれているワークフローの動作確認をする方法をまとめておきます。
注
この方法では、対象のワークフローのトリガーをworkflow_dispatchに書き換える必要があるため、トリガー部分の動作確認をすることはできません。
あくまでジョブ部分の動作確認のみになります。
ざっくりとした解説
やることは、
- デフォルトブランチに workflow_dispatchをトリガーとするダミーのワークフローファイル を配置する
- 別ブランチのダミーのワークフローファイルを編集し、動作確認したいワークフローの内容に書き換える
- 書き換えたダミーのワークフローを手動で実行する
という流れ。
ただ、2.において以下の2点に気をつける必要があります:
- ワークフローの nameを変えない こと
- トリガーを workflow_dispatchにする こと
(ジョブの中でトリガーイベントの値を使用する場合は、workflow_dispatchのinputsで手動で入力するようにする)
(実はファイル名さえ同じであればnameは合わせなくても動かせますが、GitHubはワークフロー名で識別しているみたいなので合わせた方がいいかも)
具体例
下記のワークフロー (参考元) の動作確認をする例を書いてみます。
任意のIssueに help-wanted
というラベルが貼られるとコメントをするワークフローです:
name: Add comment
on:
issues:
types: [ labeled ]
jobs:
add-comment:
if: github.event.label.name == 'help-wanted'
runs-on: ubuntu-latest
steps:
- name: Add comment
uses: peter-evans/create-or-update-comment@v1
with:
issue-number: ${{ github.event.issue.number }}
body: This issue is available for anyone to work on. Please contribute!
1. デフォルトブランチにworkflow_dispatchをトリガーとするダミーのワークフローファイルを配置する
下記の dummy.yamlをデフォルトブランチに配置します:
name: Dummy for test
on:
workflow_dispatch:
jobs:
dummy:
if: ${{ false }}
runs-on: ubuntu-latest
steps:
- run: ""
if: ${{ false }}
なのでジョブはかならずスキップされます。もし実行してしまっても一切お財布に影響を与えないはず。
2. 動作確認したいブランチのダミーのワークフローファイルを置き換える
動作確認したいadd-comment.yamlをdummy.yamlにリネームし、以下のとおりに書き換えます:
- name: Add comment
+ name: Dummy for test
on:
- issues:
- types: [ labeled ]
+ workflow_dispatch:
+ inputs:
+ issue-number:
+ description: issue number
+ required: true
+ label-name:
+ description: label name
+ required: true
jobs:
add-comment:
- if: github.event.label.name == 'help-wanted'
+ if: github.event.inputs.label-name == 'help-wanted'
runs-on: ubuntu-latest
steps:
- name: Add comment
uses: peter-evans/create-or-update-comment@v1
with:
- issue-number: ${{ github.event.issue.number }}
+ issue-number: ${{ github.event.inputs.issue-number }}
body: This issue is available for anyone to work on. Please contribute!
本来 github.event.issue.number
とかで取得したい値を、代わりにworkflow_dispatchを経由して入力するようにします。
このやり方であればいろいろなパターンを気軽に試せるので、動作確認にもってこい。
最後に、動作確認したいブランチのdummy.yamlを、↑で作ったdummy.yamlで置き換えましょう。
3. 書き換えたダミーのワークフローを手動で実行する
あとは、Dummy for test
ワークフローを ブランチを切り替えて手動実行するだけ!
上記の状態で実行すれば、Issue #10にコメントが作成されます🎉
label-nameを help-wanted
以外にしてみると ちゃんとジョブがスキップされることも確認できるはずです。
このように、トリガー部分のロジック (ブランチ名のマッチングとか) を除けば ほぼ実環境に近い状態で動作確認したりできるので、便利。使ってみてね。
おわり