CircleCIのYAMLの仕様が変わった
CircleCIを使っている。
今週水曜(2018年10月10日)なぜか本番デプロイができなくなっていた。
調査すると設定を書いているYAMLの仕様が変更されたようで、キーの上書きができなくなっていた。
元々の仕様
デプロイにはFabricを使用している。
fab dev deploy
で開発環境、 fab prod deploy
で本番環境にデプロイされるように設定ファイルを書いている。
references: env_dev: &env_dev environment: ENV: dev env_prod: &env_prod environment: ENV: prod jobs: deploy_dev: &deploy docker: - image: circleci/python:3.6 environment: AWS_DEFAULT_REGION: ap-northeast-1 steps: - checkout - run: name: Install python package command: sudo pip install -r requirements.txt - run: name: Deploy command: fab $ENV deploy <<: *env_dev deploy: <<: *deploy <<: *env_prod
Anchor(&name)とAlias(*name)を使用してコンパクトに書いている。
CircleCIは各jobページのConfigurationタブで展開されたYAMLを確認することができる。
展開されたYAMLを確認すると下記のようになっている。
jobs: deploy_dev: environment: - ENV: dev steps: - checkout - run: name: Install python package command: sudo pip install -r requirements.txt - run: name: Deploy command: fab $ENV deploy docker: - image: circleci/python:3.6 environment: AWS_DEFAULT_REGION: ap-northeast-1 deploy: environment: - ENV: prod docker: - image: circleci/python:3.6 environment: AWS_DEFAULT_REGION: ap-northeast-1 steps: - checkout - run: name: Install python package command: sudo pip install -r requirements.txt - run: name: Deploy command: fab $ENV deploy
ちゃんと environment
に ENV
が上書きされて展開されているのがわかります。
仕様変更後
水曜日、本番デプロイのCIが失敗することで仕様変更を知る。
仕様変更後に展開されたYAMLを確認すると deploy
jobの ENV
が上書きされず、 dev
のままになってしまっていた。
jobs: ... deploy: ... environment: - ENV: dev
Twitterでつぶやかれている方も居た。
違うっぽい。circleciのYAMLパーザがおかしくなってないっすか
— こうげ (@koooge) October 10, 2018
修正
AnchorとAlias周りがおかしいのではないかという事はすぐわかったので、以下のように修正を行った。
deploy: - <<: *deploy - <<: *env_prod + <<: [*env_prod, *deploy]
元々は *deploy
を先に書き、そこに *env_prod
を上書きするという意図で書いていた。
しかし、上書きされないため書く順番を逆にし、 *env_prod
を先に書き、 *deploy
を後に書いた。
この時、Aliasの書き方もCircleCIで推奨されている []
を使用した書き方に変更した。
すると下記のように以前の想定通り展開されました。
jobs: ... deploy: environment: - ENV: prod docker: - image: circleci/python:3.6 environment: AWS_DEFAULT_REGION: ap-northeast-1 steps: - checkout - run: name: Install python package command: sudo pip install -r requirements.txt - run: name: Deploy command: fab $ENV deploy
そして無事デプロイされるようになった。