Technology Engineering

178inaba の技術ブログ

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を確認することができる。

f:id:i178inaba:20181014050410p:plain

展開された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

ちゃんと environmentENV が上書きされて展開されているのがわかります。

仕様変更後

水曜日、本番デプロイのCIが失敗することで仕様変更を知る。
仕様変更後に展開されたYAMLを確認すると deploy jobの ENV が上書きされず、 dev のままになってしまっていた。

jobs:
  ...
  deploy:
    ...
    environment:
    - ENV: dev

Twitterでつぶやかれている方も居た。

修正

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

そして無事デプロイされるようになった。