Back to blog
Jan 26, 2023
2 min read

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

GitHub Actionsでcronが動かない問題を解決します。答えはシンプルでデフォルトブランチにそのワークフローファイルを置くことでした。

はじめに

こんにちは、こふです。

原因

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: mainref: 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 Actionscronの使い所は限られることも分かりました。

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