投稿:
更新:
【GitHub Actions】cronが動かない問題を解決する【schedule】
はじめに
こんにちは。困っていたが検索しても解説記事がないため書くことにしました。
原因
mainブランチ(default branchとして設定している任意のブランチ)に、動かしたいcronを含むGitHub Actionsが含まれていないことが原因でした。
またその後のsample.yamlの編集もmainブランチに反映されない限り、上書きされないことが分かりました。
ここでは
mainブランチ = デフォルトブランチとします。
つまり、以下のようなスクリプトをmainブランチに Mergeなり何なりで存在させることでcronが動き始めました。
name: First Cron Job
on:
push:
branches:
- main
- develop
schedule:
- cron: "*/5 * * * *"
workflow_dispatch:
jobs:
cron:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
ref: main
- name: Run a one-line script
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を書き換える必要があります。
steps:
- uses: actions/checkout@v3
with:
ref: main
おわりに
そもそも GitHub Actions の cron は遅延して動くので、その点も含め検証を正しく行えたかはわかりません。
遅延の詳細:https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule
いつの時点で Queue に入るのかも仕様が調査してもわかりませんでした。有識者求む。
また、GitHub Actionsのcronの使い所は限られることも分かりました。
常にmainブランチなら気にすること皆無ですがそんなことないですからね。