CircleCI で設定ファイルを指定して手動実行してみるテスト

これまで雰囲気で CircleCI を触ってた

んだけど、わけあって(おい!)ちゃんと勉強しようと思ったので、ひととおりドキュメントに目を通して、この本をさらっと読んだ。想像してたよりも新しい情報が説明されていてとても良い本でした。

gihyo.jp

そんなわけで、

CircleCI 完全に理解した!!

知らない人もいると思うのでちゃんと書いておくと「完全に理解した」は「入門したぞー!」って意味ね。まぁ、↓の左の人は本当に完全に理解してると思うけど(もちろん右の人も)

雰囲気は分かったので、実際に触りはじめることにする。今日は2つの部品で遊んでみた。

部品1:Dynamic Configuration

最初の部品は Dynamic Configuration。設定ファイルを動的に生成して使うことができる。この記事で知った:

Dynamic Configurationを使って.circleci/config.ymlを分割する

この記事では、config.yml を分割して管理しておいて、実行時にファイルを yq でマージしてる。なるほどなー。分割できるのはとても良さそう。

記事の中では yq をインストールしてるけど、手元で確認してみたら最初からイメージに入ってそう。最近追加されたのかもしれない?

❯ docker run --platform linux/x86_64 -ti --rm cimg/base:stable yq --version
yq (https://github.com/mikefarah/yq/) version 4.13.3

なんとなく雰囲気は分かったので、実際に自分でやってみたらどういう感じなのか確かめてみよう。まねしてファイルを分割してもいいけど、せっかくなのでちょっとだけ違う方向で「設定ファイルを選んで実行」みたいなのやってみようかな。

部品2:Run Pipeline

「設定ファイルを選んで実行」をやろうと思ったら実行時にパラメーターを渡したい。ので、今日使うもうひとつの部品は Run Pipeline。手動で実行するボタン。再実行じゃなくて、新規実行ね。

f:id:bufferings:20211125211614p:plain

CircleCI って手動実行できないイメージあったんだけど、今年の6月に実行できるようになったみたい。へー。

CircleCI Cloud の「パイプラインの手動実行ボタン (manual pipeline run button)」を試す

この記事のころはパラメーター指定のダイアログがでてなかったけど、今はでるようになってる。8月の更新で入ったみたい: CircleCI に関する最新情報 - CircleCI

手動でのパイプラインの実行に対するパラメーターの追加

UI から手動でパイプラインを実行する際に1つまたは複数のパラメーターを追加できるようになりました。

触ってみた感じ、もうちょっと画面でパラメータを使いやすくなると便利そうかなぁ。config.yml のパイプラインパラメーターの定義とデフォルト値を読んでフォームを作ってくれたらとても良さそうな予感。今後に期待。

ともあれ Run Pipeline でパラメータを渡せそうなので、これを使う。

今日の遊び

はい。この Dynamic Configuration と Run Pipeline を使って「設定ファイルを選んで実行」をやってみた。

Dynamic Configuration を有効化

まずは「このプロジェクトでは Dynamic Configuration を使うよー」って言っとく必要があるみたいなので、オンにした

https://circleci.com/docs/ja/2.0/dynamic-config/#getting-started-with-dynamic-config-in-circleci

簡単な構成

❯ tree .circleci
.circleci
├── config.yml
├── config1.yml
└── config2.yml

config.yml に Dynamic Configuration の設定を書いて、実行時に config1.yml を使うか config2.yml を使うかを指定するようにしてみる。

Dynamic Configuration の設定

ここに書いてある例を見ながら

https://circleci.com/docs/ja/2.0/configuration-cookbook/?section=examples-and-guides#a-basic-example

最終的には、こんな感じにした

version: 2.1

setup: true

orbs:
  continuation: circleci/continuation@0.1.2

# 実行時に渡すパラメータ
# config1 だったら config1.yml を、config2 だったら config2.yml を使って実行する
parameters:
  config:
    type: enum
    enum: ["", config1, config2]
    default: "" # push 手動実行時以外は動かないようにしてみたかったので空文字をデフォルトにしておいた

jobs:
  setup:
    executor: continuation/default
    steps:
      - checkout
      - continuation/continue:
          # ここでパラメータを使ってる
          configuration_path: .circleci/<< pipeline.parameters.config >>.yml

workflows:
  setup:
    # パラメータを指定したときだけ動くようにしといた
    when: << pipeline.parameters.config >>
    jobs:
      - setup

config1.yml と config2.yml

config1.yml と config2.yml はどっちも Hello World そのままで、それぞれワークフローの名前が say-hello-workflow1say-hello-workflow2 になってるだけ。

一箇所だけ、ふむーってなったのが、パラメータのところ。今回、パラメータは setup のときにだけ使ってるんだけど、どうもそこで使ったパイプラインパラメータが、この config1 と 2 を実行するときにも渡されるみたいで、「定義されてないパラメータを受け取ったよ!」ってエラーになってしまう。ので仕方なしに、こっちの config にもパラメータを定義しておいた。

version: 2.1

# 怒られるから定義だけしといた
parameters:
  config:
    type: enum
    enum: ["", config1, config2]
    default: ""

jobs:
  say-hello:
    docker:
      - image: cimg/base:stable
    steps:
      - checkout
      - run:
          name: "Say hello"
          command: "echo Hello, World2!"

workflows:
  say-hello-workflow1: # config2.yml は say-hello-workflow2 という名前になってるだけ
    jobs:
      - say-hello

setup で使ったパイプラインパラメータを、実際に実行するときにまで引き継がないほうが嬉しいかなぁ。もし引き渡したかったら continuation/continue のパラメータで渡せばいいと思うし。ここも今後に期待かな。

参照: CircleCI Developer Hub - circleci/continuation

push

じゃ、動作確認してみよう。まずは、変更をプッシュしただけだと、実行されない。よし。

f:id:bufferings:20211125224325p:plain

からの、実行

書いて説明するよりこっちのがはやいかと思ったのでスクリーンキャストにしておいた

vimeo.com

ヽ(=´▽`=)ノ

まとめ

  • Dynamic Configuration わりと面白い
  • ファイルを指定して手動実行ができると、例えばデプロイを別の設定ファイルに書いといて、他の設定との衝突とかを全く気にせずに書けて便利だったりするかもしれない?
  • パラメータを指定する UI のところと、Dynamic Configuration でパラメータが引き継がれてしまうところに対して、自分の意見をフィードバックしておこうかな

面白かった。