Circle CIで、ジョブをスケジュール実行しようとしたら色々とハマったのでまとめです。
ちなみに、Circle CI 2.0のworkflowsを前提としています。
ハマりやすい箇所
1) そもそも動かない
Circle CIはyaml形式で処理を記述しますが、yamlのsyntaxエラーはチェックしてくれる一方で、**記述内容の妥当性チェックはしてくれません。**そのため、記述内容に問題があっても、Circle CIは何も通知してくれず、課題発見・解決が面倒です。後述の「基本的な作業方針」のように、少しずつ作業を進めて、問題の切り分けをしやすくした方が無難です。
2) (関連のない)定義済みのジョブがPull Requestのたびに動いてしまう
少しずつ作業を進めていこうとすると、ネックになる課題です。
これは、GitHubのコミットメッセージに[ci skip]
または[skip ci]
を追記することで回避できます。
(参考)https://circleci.com/docs/2.0/skip-build/
3) cronに"H"を指定しても動かない
Jenkinsユーザがまず最初につまづく箇所だと思います。
cronに"H"を指定できるのは、Jenkins独自の仕様です。0などの整数値を指定しましょう。
(参考)https://www.jenkins.io/doc/book/pipeline/syntax/#cron-syntax
4) cronに"*/3"のような指定をしても動かない
Circle CIは、この表記方法をサポートしていません。
cron: "* 0,3,6,9 * *"
のように、カンマ区切りで列挙する必要があります。
(参考)https://circleci.com/docs/2.0/workflows/#specifying-a-valid-schedule
5) 指定した時間にcronが動かない
Circle CIは、タイムゾーンがUTCになっています。
そのため、日本時間前提で考える場合、実行したい時間から9を引いた値を設定する必要があります。
(例) 15時=6
(=15-9)、午前1時=16
(=25-9)
基本的な作業方針
いわゆる「divide and conquer」です。
一度にまとめて作業をして混乱することを避け、下記のように少しずつ作業を進めて、問題の切り分けをしやすくすると良いです。
1) run "echo xxx"
のような簡単なジョブを作り、動作確認をしやすくする
jobs:
-- 中略 --
# ここ
temp-task:
docker:
- image: docker:18.09.6
steps:
- run: echo "Testing"
workflows:
version: 2
main:
jobs:
- temp-task
2) まずfilters
が正常に動作することを確認する
jobs:
-- 中略 --
temp-task:
docker:
- image: docker:18.09.6
steps:
- run: echo "Testing"
workflows:
version: 2
main:
jobs:
- temp-task:
# ここ
filters:
branches:
only: test
3) filters
が正常に動作することを確認したら、cronの動作確認に移る
jobs:
-- 中略 --
temp-task:
docker:
- image: docker:18.09.6
steps:
- run: echo "Testing"
workflows:
version: 2
main:
jobs:
- temp-task:
# ここ
triggers:
- schedule:
cron: "0 3 * * *"
filters:
branches:
only: test