CircleCIでジョブを定期実行する方法 (Dynamic Configも対応)
目標
CircleCIで定期実行ができるようにします。
対象
- CircleCIで定期実行したい人
- 2022年度末に廃止予定のScheduled Workflowsの移行方法を確認したい人
- migrationガイドを読んでもよく分からなかった人
- Dynamic Configでconfig.ymlを分割したいけど、定期実行のやり方が分からない人
コード
こちらがサンプルコードです。
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.
また、Dynamic Configを使う場合は、そもそもこれが動かないです。
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を設定します。
Trigger名や実行する月・曜日・時間を指定します。
ちなみに、何時に何回実行するか (最大12回/時間) は指定できますが、何分に実行するかは指定できません。
最後に定期実行時に設定するパイプラインパラメーターを決めれば完了です。
ここで指定したパイプラインパラメーター名はymlファイルの方にも記述します。
コードの準備
コードは以下のようになります。
parametersの部分に、Triggerで設定したParameterを追記します。Trigger発火時にのみ実行したいので、default値はfalseにしておきます。
workflowsのジョブの発火条件はwhen: << pipeline.parameters.scheduled_pipeline >>
とすることで、Trigger発火時にのみジョブを発火できます。
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
を追加し、continuationやpath-filteringなどのconfig-pathを指定できるorbsを使います。
ちなみに、continuationは別ファイルに記述されているジョブを実行するためのorbsで、path-filteringは特定フォルダ内のファイルが変更されたときにジョブを実行するためのorbsです。
# 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発火時に設定してます。
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
定期実行が発火すると、以下のようになります。
以上
Discussion