CircleCI で cron を設定する方法

公式ドキュメント

CircleCI は公式ドキュメントが充実していますので、一読しましょう*1

circleci.com

YAML の例

cron を実行するための最低限に近い .circleci/config.yml の例は次のとおりです。

version: 2
jobs:
  build:
    docker:
      - image: circleci/node:13.5.0
    working_directory: ~/repo
    steps:
      - checkout
      - run:
          name: Hello, CircleCI cron World
          command: |
            echo 'Hello, CircleCI cron World!'
workflows:
  version: 2
  lets_execute_cron:
    triggers:
      - schedule:
          cron: '10 09 * * *'
          filters:
            branches:
              only:
                - master
    jobs:
      - build

workflows を用いることが必須であり、ポイントです。

workflows の書き方

workflows の直下の値には、workflow を区別するための任意の名前をつけます。上記の YAML の例で言えば、lets_execute_cron がその名前です。

workflow は複数作ることができ、作った workflow は全て実行対象となります。

各々の workflow の直下の値に triggers を取ることができます。その triggers の値(厳密には配列の要素)として schedule を取ることで cron を用いて workflow を発動させることができます。このとき、cron の対象となるブランチを filters というキーバリューで設定できます。

各々の workflow の直下の値には jobs も取る必要があります。ここで指定した値(厳密には配列の要素)の job が、その workflow にて実行される job となります。

以上を踏まえて上記の YAML 例を改めて見てみると、以下のとおりであることが分かります。

  • lets_execute_cron という workflow を定義している
    • その workflow では triggers を以下のように定義している
      • 「日本時間で 毎日 18:10」に lets_execute_cron という workflow を実行する
      • 実行対象のブランチは master である
    • 実行される job は build である
      • job の定義は YAML の冒頭に書かれている

他にも細かく設定できます。詳しくは 公式ドキュメント を読みましょう。

注意点

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

  • 新しい CircleCI の UI では履歴が正しく表示されないときがある?っぽいです
  • 時刻指定の際のタイムゾーンは UTC(GMT) です
    • したがって「日本の時刻から 9時間マイナスした時刻」を指定する必要があります
    • また、日付を指定する場合には、日付のまたぎによるミスに注意する必要があります
  • YAML においては * は特別な文字なので、cron: で指定する値はクォートする必要があります
  • 例に挙げた YAML の workflows の定義では cron 以外に job が発動しないため、例えば push とともに反映させるためにはそのための workflow を追加する必要があります
    • 追加すべき workflow の書き方は簡単で、workflow の名前を任意に付けて、その直下に jobs を指定するだけです
    • 「push があった際に常に実行する workflow」を付け加えた冒頭の YAML の例は、以下のようになります
workflows:
  version: 2
  lets_execute_cron:
    triggers:
      - schedule:
          cron: '10 09 * * *'
          filters:
            branches:
              only:
                - master
    jobs:
      - build
  lets_execute_build_job_when_pushed:
    jobs:
      - build

*1:ぶっちゃけ公式ドキュメントを読み込めばほぼ分かってしまいます

Powered by はてなブログ