GitHub Actions で複数の cron を指定する（on.schedule.cron）

[「github actions on schedule cron "複数" 指定」でググって](https://www.google.com/search?q=github+actions+on+schedule+cron+%22%E8%A4%87%E6%95%B0%22+%E6%8C%87%E5%AE%9A)も、複数指定の方法がドンピシャで出てこなかったので自分のググラビリティとして。

## TL; DR <sub><sup><sub><sup>（今北産業）</sup></sub></sup></sub>

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

    ```yaml:複数のcronジョブをon.schedule.cronに定義する例
    on:
      schedule:
        - cron: '0 18 * * SUN'
        - cron: '0 2 * * MON'
    ```

1. `cron` は UTC なので日本時間（JST）に合わせたい場合は 9 時間引いた時間を指定する。
1. [POSIX 準拠の crontab シンタックス（構文）](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/crontab.html#tag_20_25_07)。それ以外は使えない。例えば `@weekly` などは使えない。

### 関連資料

- [schedule](https://docs.github.com/en/actions/reference/events-that-trigger-workflows#schedule) | Events that trigger workflows | Reference @ docs.github.com
- [crontab guru](https://crontab.guru/) オンライン crontab ジェネレーター
- [crontab サンプル集](https://crontab.guru/examples.html) | よくある crontab 設定

## TS; DR <sub><sup><sub><sup>（ドキュメント嫁に叱られる）</sup></sub></sup></sub>

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

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

![スクリーンショット 2021-07-19 10.46.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78776/737d61e4-9de0-f43c-1b83-ad0dd5dad25d.png "Check failure on line 12 in .github/workflows/build_weekly.yml GitHub Actions .github/workflows/build_weekly.yml Invalid workflow file You have an error in your yaml syntax on line 12")

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

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

> 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` 文により月曜もしくは水曜にスキップしています。
>
> ```yaml
> 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"
> ```

https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule

### JSON スキーマから確認

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

schemastore.org の [GitHub Workflow の JSON スキーマの定義](https://json.schemastore.org/github-workflow.json)を見ると、`cron` の<ruby>型<rt>type</rt></ruby>は `string` でした。つまり、配列型で指定すると当然エラーが出るということです。

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

```jsonc
"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}$"
        }
      }
    }
  }
}
```

- （[github-workflow.json](https://json.schemastore.org/github-workflow.json) | @ schemastore.org より）