GitHub Actions で cron を設定する方法

公式ドキュメント

日本語のドキュメントは、例え用意してあったとしても、情報が古いことがあるので気をつけましょう*1

help.github.com

YAML の書き方

cron を設定するための最小限の YAML を書くと次のようになります。

name: FOOBAR
on:
  schedule:
    - cron: '34 12 * * *'
jobs:
  my_cron_job:
    name: hogehoge
    runs-on: ubuntu-latest
    steps:
    - name: Hello My Cron Job
      run: |
        echo 'Hello, My Cron Job!'

上記を push すると「日本時間で毎日 21:34 に my_cron_job の内容が実行」されます。

注意点

細かい注意点がいくつかあります。

  • 時刻指定の際のタイムゾーンは UTC(GMT) です
    • したがって「日本の時刻から 9時間マイナスした時刻」を指定する必要があります
    • また、日付を指定する場合には、日付のまたぎによるミスに注意する必要があります
  • YAML において * は特別な文字なので、cron: で指定する値はクォートする必要があります
  • 最小の実行可能時刻の間隔は 5分 なので、実際に実行される時刻は分単位で見ると結構いい加減な印象です
    • daily / nightly ビルドや、深夜に時間をかけて回すビルド などに使う分には全く問題ないと思います
  • 「実行対象となるブランチはデフォルトブランチ」です
    • これが結構ハマりやすいです

gyazo.com

補足

冒頭の YAML の書き方ですと、cron でしか job が発動しません。push でも発動させたい場合は以下の 2つ の方法があります*2

1つ目の方法: 冒頭の YAML の on: の値に push: を追加する

発動の契機として push: を追加します。キーのみの追加で良いです*3。追加したあとの YAML は次のようになります。

name: FOOBAR
on:
  push:
  schedule:
    - cron: '34 12 * * *'
jobs:
  my_cron_job:
    name: hogehoge
    runs-on: ubuntu-latest
    steps:
    - name: Hello My Cron Job
      run: |
        echo 'Hello, My Cron Job!'

2つ目の方法: 発動契機の種類ごとに YAML ファイルを分割する

GitHub Actions では .github/workflows 直下にある YAML ファイル全てを GitHub Actions の設定ファイルとみなします。

したがって、on:push: のみを設定した YAML ファイルを一つ書き、on:schedule: のみを設定した YAML を一つ書けば、on:push: の両方を契機にして job を発動させられます。

この方法だと push:schedule: で異なる内容の job を実行させることができます*4

ログの出力について

GitHub Actions の実行ログ一覧では、何を発動契機としたか、が一覧に表示されるので、それにより schedule: で発動したことを確認することができます。

gyazo.com

*1:この記事の内容も古くなっていることがあり得ます

*2:他にもあるでしょう

*3:値は空っぽで良い

*4:ただし、両方で全く同じ内容の job を実行させたい場合は典型的な 非DRY になります

Powered by はてなブログ