何日か前に Dynamic Configuration で別のファイルを読み込んで実行して遊んだけど、そういえば、この continuation
Orb って何をやってるんだろう?ってのが、ふと、気になった
ので、適当に見てみよう。
continuation
前回はドキュメントに書いてある通りバージョン 0.1.2 を使ったけど、今日現在では 0.2.0 が最新か。次から最新を使っとこっと。
CircleCI Developer Hub - circleci/continuation
このページの Orb Source のところに、Orb のソースが書いてあるので見てみる
その前に
ところで CircleCI の CLI でも展開することができる。例えばこんな sample.yml
を用意して
version: 2.1 orbs: continuation: circleci/continuation@0.2.0 workflows: use-my-orb: jobs: - continuation/continue: configuration_path: ./target.yml
こんな風にコマンドを実行すれば
❯ circleci config process sample.yml > sample-processed.yml
Orb が展開される
# Orb 'circleci/continuation@0.2.0' resolved to 'circleci/continuation@0.2.0' version: 2 jobs: continuation/continue: docker: - image: cimg/base:stable steps: - checkout - run: command: | if [ -z "${CIRCLE_CONTINUATION_KEY}" ]; then echo "CIRCLE_CONTINUATION_KEY is required. Make sure setup workflows are enabled." exit 1 fi ...
中でどんなことやるのか気になるときに便利かなぁ。まぁ、今回の場合は、すでに実行したログがあるからそこから見ていっても良いか
いろんな確認方法があるね
Orb Source を読んでみる
ということで continue
コマンドのとこを見てみよう。この辺がコアかな。面白い:
jq -Rs '.' "$CONFIG_PATH" > /tmp/circleci/config-string.json jq -n \ --arg continuation "$CIRCLE_CONTINUATION_KEY" \ --arg params "$PARAMS" \ --slurpfile config /tmp/circleci/config-string.json \ '{"continuation-key": $continuation, "configuration": $config|join("\n"), "parameters": $params|fromjson}' > /tmp/circleci/continue_post.json cat /tmp/circleci/continue_post.json [[ $(curl \ -o /dev/stderr \ -w '%{http_code}' \ -XPOST \ -H "Content-Type: application/json" \ -H "Accept: application/json" \ --data @/tmp/circleci/continue_post.json \ "https://${CIRCLECI_DOMAIN}/api/v2/pipeline/continue") \ -eq 200 ]]
ざっくりと説明
最初に、continue
に渡した YAML の設定ファイルを文字列として config-string.json に保存してる
jq -Rs '.' "$CONFIG_PATH" > /tmp/circleci/config-string.json
jq
のことを自分が勘違いしてるかな?と思ったけど、実行ログ見たら↓な感じになってた。合ってた
"version: 2.1\n\nparameters:\n config:\n type: enum\n enum: [\"\", config1, config2]\n default: \"\"\n\njobs:\n say-hello:\n docker:\n - image: cimg/base:stable\n steps:\n - checkout\n - run:\n name: \"Say hello\"\n command: \"echo Hello, World2!\"\n\nworkflows:\n say-hello-workflow2:\n jobs:\n - say-hello\n"
ほほー
次に、各種パラメーターと↑の値をあわせて continue_post.json
って名前の JSON ファイルを作ってる
jq -n \ --arg continuation "$CIRCLE_CONTINUATION_KEY" \ --arg params "$PARAMS" \ --slurpfile config /tmp/circleci/config-string.json \ '{"continuation-key": $continuation, "configuration": $config|join("\n"), "parameters": $params|fromjson}' > /tmp/circleci/continue_post.json
jq
便利ね
$CIRCLE_CONTINUATION_KEY
は内緒のキーで、setup のときだけ CircleCI から渡されるみたい。そして、これをつけるとパイプラインが続行できるっぽい$PARAMS
には JSON 形式でパラメータを入れておけばいいみたい。今回は使ってないけど
出来上がったファイルは↓な感じ
{ "continuation-key": "******* ...", "configuration": "version: 2.1\n\nparameters:\n ...", "parameters": {} }
で、そのファイルを使って、continue
API を呼び出してるのか
[[ $(curl \ -o /dev/stderr \ -w '%{http_code}' \ -XPOST \ -H "Content-Type: application/json" \ -H "Accept: application/json" \ --data @/tmp/circleci/continue_post.json \ "https://${CIRCLECI_DOMAIN}/api/v2/pipeline/continue") \ -eq 200 ]]
なるほど
API の Spec
これかー
https://circleci.com/docs/api/v2/#operation/continuePipeline
へー
って思いつつうろうろしてたら、詳しい説明があったー。だいたい合ってた
すっきりした。なんか面白い使い方あるかなぁ?