※記事のURLの一部は広告を含みます。

画像のうち一部が正しく表示されていない期間がありました。ご迷惑をおかけし申し訳ありません。

【GitHub Actions】cronが動かない問題を解決する【schedule】の絵文字

【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.yaml
1name: 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/checkout@v3 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: mainref: 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/checkout@v3 3 with: 4 ref: main

おわりに

そもそも GitHub Actions の cron は遅延して動くので、その点も含め検証を正しく行えたかはわかりません。

遅延の詳細:https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule

いつの時点で Queue に入るのかも仕様が調査してもわかりませんでした。有識者求む。

また、GitHub Actionscronの使い所は限られることも分かりました。

常にmainブランチなら気にすること皆無ですがそんなことないですからね。




共有する