CircleCI の continuation Orb が何をやってるか見てみた

何日か前に Dynamic Configuration で別のファイルを読み込んで実行して遊んだけど、そういえば、この continuation Orb って何をやってるんだろう?ってのが、ふと、気になった

bufferings.hatenablog.com

ので、適当に見てみよう。

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
...

中でどんなことやるのか気になるときに便利かなぁ。まぁ、今回の場合は、すでに実行したログがあるからそこから見ていっても良いか

f:id:bufferings:20211130230015p:plain

いろんな確認方法があるね

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

へー

って思いつつうろうろしてたら、詳しい説明があったー。だいたい合ってた

discuss.circleci.com

すっきりした。なんか面白い使い方あるかなぁ?