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

# はじめに
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19248/b1c5ac4e-5f67-435f-8238-e8c81fce3670.png)

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

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

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

![20201028-Webinar-再利用可能なコンフィグ-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19248/7e3675ab-44c9-09da-b7c6-beef34ea087e.png)

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

![20201028-Webinar-再利用可能なコンフィグ-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19248/ab4a3c17-55ae-bef4-405a-e3fe71ff973f.png)

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

# CircleCIを切り刻んでパラメータに渡しても受け取ってもらえない！
こんなコンフィグを書くと、私(mfunaki)であれば、Hello mfunakiと出力されるはずです。

``` yaml: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}](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19248/53f51976-8e7b-1851-92cb-9aea0b81e6bb.png)

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

![${CIRCLECI_USERNAME}](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19248/b4583d32-51d3-73ec-e0bb-148903d0472b.png)

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

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

実行結果(そこには、エラーメッセージ一つすら残されていませんでした)。
![Circle + CI](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19248/f90de7af-afea-5f0c-b863-56b266ae35aa.png)

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

私は、CircleCIの実行結果画面から、`Configuration File` を選択し、自分の書いたコンフィグを見直したんです。いちま〜い、`Source`。
![Source](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19248/1af021e2-a555-f813-e8cc-6b7da131c44d.png)

に〜ま〜い、`Compiled`。
![Compiled](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19248/ff9a9751-c27e-b472-90b8-7d33225adc78.png)
ないっ！ `Circle`も`CI`もないっ！

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

``` yaml: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19248/05d4bd43-9267-7812-2e80-cf58265ef053.png)

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

# リンク
- [【CircleCIオンラインセミナー】コンフィグの再利用性を高めよう](https://circleci.connpass.com/event/193531/) - CircleCIグループにメンバー登録、よろしくお願いします！