6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

GitHub Actions で複数の cron を指定する(on.schedule.cron)

Last updated at Posted at 2021-07-19

「github actions on schedule cron "複数" 指定」でググっても、複数指定の方法がドンピシャで出てこなかったので自分のググラビリティとして。

TL; DR (今北産業)

  1. cron の設定ごとに - cron: を定義する。

    複数のcronジョブをon.schedule.cronに定義する例
    on:
      schedule:
        - cron: '0 18 * * SUN'
        - cron: '0 2 * * MON'
    
  2. cron は UTC なので日本時間(JST)に合わせたい場合は 9 時間引いた時間を指定する。

  3. POSIX 準拠の crontab シンタックス(構文)。それ以外は使えない。例えば @weekly などは使えない。

関連資料

TS; DR (ドキュメント嫁に叱られる)

リストや配列にするとシンタックス(構文)エラーが出ます。

リストにすると"Invalid␣workflow␣file"のYAMLシンタックス・エラーが出る
on:
  schedule:
    - cron: |
      '0 18 * * SUN'
      '0 2 * * MON'

スクリーンショット 2021-07-19 10.46.56.png

公式ドキュメントから確認

確認すべきは公式ドキュメントからということで、ドキュメントと漁るとドンピシャの記述がありました。

A single workflow can be triggered by multiple schedule events. You can access the schedule event that triggered the workflow through the github.event.schedule context. This example triggers the workflow to run at 5:30 UTC every Monday-Thursday, but skips the Not on Monday or Wednesday step on Monday and Wednesday.

【筆者訳】
1 つのワークフローは、複数の "schedule" イベントでトリガー(発火)させることができます。どの schedule イベントがワークフローを発火させたかは、"github.event.schedule" コンテキストで確認できます。以下の例では、ワークフローは月曜日から木曜日の 5:30 UTC にトリガーされるものの、「Not on Monday or Wednesday」ステップは if 文により月曜もしくは水曜にスキップしています。

on:
  schedule:
    # 筆者注: 以下は cron: '30 5 * * 1,2,3,4' と同等
    - cron: '30 5 * * 1,3'
    - cron: '30 5 * * 2,4'

jobs:
  test_schedule:
    runs-on: ubuntu-latest
    steps:
      - name: Not on Monday or Wednesday
        if: github.event.schedule != '30 5 * * 1,3'
        run: echo "This step will be skipped on Monday and Wednesday"
      - name: Every time
        run: echo "This step will always run"

JSON スキーマから確認

公式ドキュメントで複数指定できることはわかったものの、余計な情報(if 文による分岐)も多く、cron に関しての情報がほとんどありません。

schemastore.org の GitHub Workflow の JSON スキーマの定義を見ると、crontypestring でした。つまり、配列型で指定すると当然エラーが出るということです。

そして、親要素の schedule を見ると type が配列(array)になっているので、cron を 1 アイテムとして配列にすればいいと言うことでした。とほほ。

"on": {
  "schedule": {
    "$comment": "...",
    "description": "...",
    "type": "array", // <- shcedule は array
    "items": {
      "properties": {
        "cron": {
          "$comment": "...",
          "type": "string", // <- cron は string 
          "pattern": "^(((\\d+,)+\\d+|((\\d+|\\*)\\/\\d+|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)|(\\d+-\\d+)|\\d+|\\*|MON|TUE|WED|THU|FRI|SAT|SUN) ?){5,7}$"
        }
      }
    }
  }
}
6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?