
【GitHub Actions】cronが動かない問題を解決する【schedule】
2023-01-26
2023-01-26
はじめに
こんにちは、こふです。
原因
main
ブランチ(default branch
として設定している任意のブランチ)に、動かしたいcron
を含むGitHub Actions
が含まれていないことが原因でした。
またその後のsample.yaml
の編集もmain
ブランチに反映されない限り、上書きされないことが分かりました。
ここでは
main
ブランチ = デフォルトブランチとします。
つまり、以下のようなスクリプトをmain
ブランチに Merge
なり何なりで存在させることでcron
が動き始めました。
.github/workflows/sample.yaml1name: First Cron Job 2on: 3 push: 4 branches: 5 - main 6 - develop 7 schedule: 8 - cron: '*/5 * * * *' 9 workflow_dispatch: 10jobs: 11 cron: 12 runs-on: ubuntu-latest 13 steps: 14 - uses: actions/[email protected] 15 with: 16 ref: main 17 - name: Run a one-line script 18 run: echo Hello, world!
参考:https://theanshuman.dev/articles/free-cron-jobs-with-github-actions-31d6
確定事項
確定事項としてmain
ブランチなどのデフォルトブランチにsample.yaml
が存在しない限りcron
は動きません
manually
に実行やpush
時に実行されてもcron
では実行されません。
sample.yaml
の書式ミスである可能性もなくはないと思うのでworkflow_dispatch:
を付けてGitHub
上やgh cli
などを用いて試すことをおすすめします。
調査結果
main
にマージ後にsample.yaml
を編集してどのコミット ID を見られるかが気になったので参考までに調査結果をまとめます。
- はじめて
main
ブランチにsample.yaml
が追加されたとき- PR からマージした(ローカルでもどっちでも良いですが)ので、その直近のコミット ID です
ref: main
としていました。hoge1
という コミット ID とします。
- 次に
main
ブランチでsample.yaml
を編集せず(コミット・プッシュせず)cron
を待ったときhoge1
が参照され実行され続ける- これは想定通りですね
- 当該
sample.yaml
以外を編集しても、です。
- 次に
main
ブランチでsample.yaml
を編集して(コミット・プッシュして)cron
を待ったときhoge2
というコミット ID とします。- 直後の実行から、最新のコミット、つまり
hoge2
を見たsample.yaml
になっていました。 - 事前に Queue に追加されるわけではない実装のよう(あくまで直前かな)
develop
ブランチを切ってそこでsample.yaml
を編集したとき- 編集といっても
ref: main
をref: develop
にすることくらいです。 hoge3
というコミット ID とします。- 原因はわかりませんが、すっと
hoge2
を参照したsample.yaml
が実行され続けました - つまり、参照先や実行するコマンドの情報に関わらず、
main
ブランチに配置されたsample.yaml
のファイルを見ている気がしてきました。
- 編集といっても
以上より、cron
で動かしたいsample.yaml
を変更した際は必ずmain
ブランチにマージすることが必要という結論に現状至りました。
補足
ちなみに、以下のように cron では特定のコミット ID を参照するに過ぎません。
(見かけ上はブランチ名ですが、それぞれのリモートブランチであってもその先頭のコミット ID)
Push 時や PR 時に実行されるものではないですし・・・
よって、ブランチを変えてsample.yaml
を書き換え、そのブランチを参照しつつ実行する必要があるのならref
を書き換える必要があります。
1steps: 2 - uses: actions/[email protected] 3 with: 4 ref: main
おわりに
そもそも GitHub Actions の cron は遅延して動くので、その点も含め検証を正しく行えたかはわかりません。
遅延の詳細:https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule
いつの時点で Queue に入るのかも仕様が調査してもわかりませんでした。有識者求む。
また、GitHub Actions
のcron
の使い所は限られることも分かりました。
常にmain
ブランチなら気にすること皆無ですがそんなことないですからね。