yaeでエイリアスを多用したYAMLファイルの出力確認をしてみる

はじめに

YAMLに項目を追加する際、重複した構成ならエイリアスの利用が好ましいと思いますが、エイリアスが意図した構成になっているかどうかが問題となります。

CircleCIのconfig.yamlに設定したWorkflowから重複を省くため、エイリアス展開を目視しながらの編集を実現するものを探していましたが特に見つからず、代わりにエイリアスを展開出力するツールにて確認を行ってみました。

yaeについて

Goで作成された、YAML の alias を anchor の内容に展開した YAML を出力するコマンドです。要はYAML展開専用のツールです。

shin1x1/yae: YAML aliases expander

go get -u github.com/shin1x1/yae
yae .circleci/config.yaml | less

PythonにおけるOrderedDictのような挙動ではないため若干項目に上下があり、インデント等にも整形が入ります。そのため厳密な差分確認には向かないと思われます。

以下、実際にエイリアスを使ったファイルをyaeに展開した例です。

.circleci/config.yaml

version: 2.1
orbs:
  aws-cli: circleci/aws-cli@0.1.16
  slack: circleci/slack@3.4.0
  aws-ecr: circleci/aws-ecr@6.5.0
references:
  save_cach_ref: &save_cach_ref
    key: pipenv-{{ .Branch }}-{{ checksum "Pipfile.lock" }}
    paths:
      - ".venv"
  docker_image: &docker_image
    docker:
      - image: circleci/python:3.7.3
        environment:
          PIPENV_VENV_IN_PROJECT: true
    resource_class: small
    parameters:
      python-version:
        type: string
        default: "3.7"
.
.
jobs:
  test:
    <<: *docker_image
    executor: aws-cli/default
    steps:
      - checkout
      - setup_remote_docker
      - restore_cache:
          key: pipenv-{{ .Branch }}-{{ checksum "Pipfile.lock" }}
      - run: echo "export latest_commit_log=$(git log --oneline -1)" >> $BASH_ENV
      - run:
          command: |
            pipenv sync --dev
      - save_cache:
          <<: *save_cach_ref

% yae .circleci/config.yaml
.
.
job:
  test:
    docker:
    - environment:
        PIPENV_VENV_IN_PROJECT: true
      image: circleci/python:3.7.3
    executor: aws-cli/default
    parameters:
      python-version:
        default: "3.7"
        type: string
    resource_class: small
    steps:
    - checkout
    - setup_remote_docker
    - restore_cache:
        key: pipenv-{{ .Branch }}-{{ checksum "Pipfile.lock" }}

あとがき

yqでのキー構成確認という手もありますが、複数の構成が正常に展開されたかどうか俯瞰確認するのには辛いなと思い、今回のエントリとなりました。

circleci cliでのvalidateにて、キー構成のミスが分かり、かつエイリアス設定のため非常に確認が面倒なケースには重宝すると思われます。