1
0

More than 3 years have passed since last update.

【CircleCI】config.ymlの中で渡したはずのパラメータが受け取られない【Devホラー】

Last updated at Posted at 2020-10-30

はじめに

Happy Halloween! 例年ならコスプレして街に繰り出したくなるところですが、今年はそれも叶わず。
であるなら、開発中に感じた恐怖な体験でも語ろうかと。本当なら日が沈んでから明かりを消した部屋でノートPCのバックライトだけを灯して書き込みたいところですが、翌日まで誰の目にも止まらないと悲しいので、朝、書いてみました。

config.ymlにおけるアンカー(&)とエイリアス(*)とは

実は私、CircleCIの中の人(Developer Advocate)をしているのですが、CircleCIについてのご相談のうち「コンフィグ(config.yml)が巨大になってしまうの、どうにかならない?」というものが結構多いです。

config.ymlは一部をサブルーチンとして切り出して呼び出すとか、オブジェクト指向言語よろしくメソッド定義して追加実行は派生クラスでsuper()した後実装するとか、そういったなんやかんやはできないわけです。

とはいえ、Version 2.1でOrbという仕組みが導入され、config.ymlを「パーツ」として取り扱う仕組みは用意されました。より正確に言えば、Version 2.1でcommands(コマンド)、executors(executor)、jobs(ジョブ)という処理の切り出しの仕組みが用意されました。単にYAML中の記述をコピペ的に再利用するというのであれば、アンカー(&)とエイリアス(*)という仕組みは従前からありました。

20201028-Webinar-再利用可能なコンフィグ-17.png

ほとんど同じ、でもちょっと違うを解決する - コマンド、executor、ジョブ+パラメータ

ただ、アンカーとエイリアスで解決できるのは「コピペ」対応できるような「まったく同じ」パーツの再利用(これはこれでかなり便利で、後述するパラメータ定義のうち、列挙型(enum)の選択肢でよく使うものはスペルミスを恐れながら何度も定義しなくても、アンカーとエイリアスを活用すべきポイントかと思います)です。

それでは、「ほとんど同じ」だけど「ちょっと違う」を解決するには、どうしたらいいでしょう? 「ほとんど同じ」部分を切り出すことができるのが、commands(コマンド)、executors(executor)、jobs(ジョブ)の機能です。

20201028-Webinar-再利用可能なコンフィグ-5.png

これらの機能と組み合わせて「ちょっと違う」に対応できるようにするのがパラメータ(parameters)という仕組みです。

20201028-Webinar-再利用可能なコンフィグ-10.png

それではみなさんもご活用ください! さようなら...にはならなかったのです。

CircleCIを切り刻んでパラメータに渡しても受け取ってもらえない!

こんなコンフィグを書くと、私(mfunaki)であれば、Hello mfunakiと出力されるはずです。

config.yml
version: 2.1

commands:
  say-hello:
    parameters:
      to:
        default: ${CIRCLE_USERNAME}
        type: string
    steps:
      - run: echo "Hello << parameters.to >>"

executors:
  default:
    parameters:
      tag:
        default: latest
        type: string
    docker:
      - image: bash:<< parameters.tag >>

jobs:
  hello-build:
    executor: default
    steps:
      - say-hello

workflows:
  workflow:
    jobs:
      - hello-build

こちら、pushしてみると、こんな感じでうまくいきます。

${CIRCLE_USERNAME}

私がよくやってしまう失敗は、環境変数名を丁寧に指定するのですが、誠意が伝わらないことです。

${CIRCLECI_USERNAME}

ただ、先日恐怖に感じたのは、パラメータ toCircleCI を切り刻んで CircleCI に分けて渡した時に、値が渡らなかったのにはたまげました。「国家安康」、徳川家康の呪いをそこに私は感じたのです。

config.yml
jobs:
  hello-build:
    executor:
      name: default
      tag: "4"
    steps:
      - say-hello:
        to: "Circle"
      - say-hello:
        to: "CI"

実行結果(そこには、エラーメッセージ一つすら残されていませんでした)。
Circle + CI

【解決】インデントの祟り(たたり)だった!

私は、CircleCIの実行結果画面から、Configuration File を選択し、自分の書いたコンフィグを見直したんです。いちま〜い、Source
Source

に〜ま〜い、Compiled
Compiled
ないっ! CircleCIもないっ!

サポートチケットを切ろうと先走る思いを抑えながら、再び、コンフィグファイルを見た時、天使が私に降りてきたのです。「そなたの欲しかった斧は、こちらではないのか」と。

config.yaml
jobs:
  hello-build:
    executor:
      name: default
      tag: "4"
    steps:
      - say-hello:
         to: "Circle"
      - say-hello:
         to: "CI"

そう、to:の前に空白x2個、忘れてしまったために、伝えようとしていた思いが伝わらなかったのでした。
Hello Circle, Hello CI

終わりに

私が CircleCI の Developer Advocate として皆さんにお伝えしたかったのは、我が社は CircleCI です。Circle CIではありません。ブログやツイッターで「Circle CI、イケてないよなー」と不満を言われても、残念ながら私の目には止まらないのです(頑張って探すようにはしますが)。CircleCI、スペース不要。忘れないでください。Twitterで呟いていただく際には、#CircleCIJp ハッシュタグ付けていただくと、皆様を見失うこともないかと思います。ご清聴ありがとうございました。

リンク

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0