🕘

CircleCIでジョブを定期実行する方法 (Dynamic Configも対応)

2022/09/19に公開

目標

CircleCIで定期実行ができるようにします。
circleci_cron

対象

  • CircleCIで定期実行したい人
  • 2022年度末に廃止予定のScheduled Workflowsの移行方法を確認したい人
  • Dynamic Configでconfig.ymlを分割したいけど、定期実行のやり方が分からない人

コード

こちらがサンプルコードです。

https://github.com/kusakabe-t/playground/tree/main/circleci/dynamic_cron

Scheduled Workflows (いずれ使えなくなる)

従来は以下のように、triggers.scheduleでcron式を書くことで、定期実行が出来てました。
しかし、この書き方は2022年度末までに段階的に廃止予定で、いずれ動かなくなります。

Scheduled workflows will be phased out by the end of 2022. Visit the scheduled pipelines migration guide to find out how to migrate existing scheduled workflows to scheduled pipelines, or to set up scheduled pipelines from scratch.

https://circleci.com/docs/workflows#scheduling-a-workflow

また、Dynamic Configを使う場合は、そもそもこれが動かないです。

.circleci/config.yml
version: 2.1
jobs:
  echo_sample:
    docker:
      - image: cimg/node:14.17.6
    steps:
      - run:
          name: scheduled echo
          command: echo "hello"
workflows:
  scheduled_echo_sample:
    triggers:
      - schedule:
          cron: "47 1 * * 0-4"
          filters:
            branches:
              only:
                - master
    jobs:
      - echo_sample

Pipelineのスケジュール実行 (これからの定期実行の書き方)

Scheduled Workflowsではcron式をymlファイルに記述していましたが、パイプラインのスケジュール実行ではcronの実行間隔や曜日設定などをCircleCIのProject Settingsの方で設定することになります。

CircleCI側の準備

まず、CircleCIの方でTriggersを設定します。

project設定から、サイドバーのTriggersを選択し、Triggerを設定します。
project
trigger

Trigger名や実行する月・曜日・時間を指定します。
ちなみに、何時に何回実行するか (最大12回/時間) は指定できますが、何分に実行するかは指定できません。

最後に定期実行時に設定するパイプラインパラメーターを決めれば完了です。
ここで指定したパイプラインパラメーター名はymlファイルの方にも記述します。
pipeline_parameter

コードの準備

コードは以下のようになります。
parametersの部分に、Triggerで設定したParameterを追記します。Trigger発火時にのみ実行したいので、default値はfalseにしておきます。
workflowsのジョブの発火条件はwhen: << pipeline.parameters.scheduled_pipeline >>とすることで、Trigger発火時にのみジョブを発火できます。

.circleci/config.yml
version: 2.1
parameters:
  scheduled_pipeline:
    type: boolean
    default: false
jobs:
  echo_sample1:
    docker:
      - image: cimg/node:14.10.1
    steps:
      - run: echo "hello world"
workflows:
  scheduled_test:
    when: << pipeline.parameters.scheduled_pipeline >>
    jobs:
      - echo_sample1

Dynamic Configで使いたい場合

Dynamic Configは、.circleci/config.ymlをジョブごとにファイル分割して管理するための機能です。

Dynamic Configを使うときはsetup: trueを追加し、continuationpath-filteringなどのconfig-pathを指定できるorbsを使います。
ちなみに、continuationは別ファイルに記述されているジョブを実行するためのorbsで、path-filteringは特定フォルダ内のファイルが変更されたときにジョブを実行するためのorbsです。

.circleci/config.yml
# cf. https://circleci.com/developer/orbs/orb/circleci/continuation
version: 2.1
setup: true
parameters:
  scheduled_pipeline2:
    type: boolean
    default: false
orbs:
  continuation: circleci/continuation@0.3.1
workflows:
  scheduled_test:
    when: << pipeline.parameters.scheduled_pipeline2 >>
    jobs:
      - continuation/continue:
          name: 'start dynamic config'
          configuration_path: .circleci/echo.yml

別ファイルのジョブを実行するときは、別ファイルの方にもParameterを追記する必要があります。理由は不明ですが、Unexpected argument(s)が発生するためです (workflowsが別れるのが原因でしょうか?)。

エラー発生時のスクショ

※ スクショではscheduled_pipeline2をTrigger発火時に設定してます。
エラー発生時のスクショ

.circleci/echo.yml
version: 2.1
# config.ymlから渡される引数を受け取れるようにしておく。そうしないと、何故か以下のエラーが発生する
# Unexpected argument(s): scheduled_pipeline
parameters:
  scheduled_pipeline:
    type: boolean
    default: false
jobs:
  echo_sample2:
    docker:
      - image: cimg/node:14.10.1
    steps:
      - run: echo "dynamic config scheduled job!!"
workflows:
  scheduled_test:
    jobs:
      - echo_sample2

定期実行が発火すると、以下のようになります。
trigger-demo

以上

GitHubで編集を提案

Discussion