CircleCI 2.0 で AWS CodeDeploy を使う

まず、 CircleCI 1.0 で CodeDeploy を使っているという前提で話を進めます。
そのため、デプロイ先のインスタンスへの CodeDeploy エージェントインストールなどについては触れません。

先に示すこれは失敗する例です。
成功する例はこの記事の一番最後に書いてあります。

.circleci/config.yml

version: 2
jobs:
  deploy:
    working_directory: ~/repo
    docker:
      - image: naughtldy/circleci-node-awscli:8
    steps:
      - checkout
      - run:
          name: zip
          command: "zip -r master ../repo"
      - run:
          name: zip upload
          command: aws s3 cp master.zip s3://{バケット名}/{ファイル名} --region ap-northeast-1
      - run:
          name: Deploy Staging
          command: |
            aws deploy create-deployment \
              --application-name bot-ryuzu \
              --deployment-group-name ryuzu-prod \
              --s3-location bucket="{バケット名}",bundleType="zip",eTag=`aws s3api head-object --bucket {バケット名} --key {ファイル名} | jq .ETag`,key="{ファイル名}" \
              --region ap-northeast-1

workflows:
  version: 2
  deploy:
    jobs:
      - deploy:
          filters:
            branches:
              only: master

実行結果は、 appspec.yml が無いという理由でデプロイに失敗します。
CircleCI 1.0 で動いていたので、ファイルが不足するなどの理由はないはずなので CircleCI 1.0 のときと比較してみます。

デプロイしたソースコードは、 CodeDeploy によるデプロイ先インスタンス

/opt/codedeploy-agent/deployment-root/{英数字の羅列}/

ここにデプロイIDごとにディレクトリが分かれて入っています。

以前の成功していた時のものを見てみると、デプロイIDのディレクトリの中身は

bundle.tar
deployment-archive
logs

となっています。

CodeDeploy でデプロイするソースコードなどは deployment-archive の中に入ってます。

失敗する場合は

bundle.tar
deployment-archive
repo

となります。

repo はCircleCIでのソースコード展開先のディレクトリ名です。

そうすると、 CodeDeploy のイベント BeforeInstall で、ディレクトdeployment-archive の中に appspec.yml が無いというエラーで CodeDeploy の実行に失敗します。
確認してみると deployment-archive の中身が空で、ソースコードなどは repo に入っています。

こちらが成功する例です。

.circleci/config.yml

version: 2
jobs:
  deploy:
    working_directory: ~/deployment-archive
    docker:
      - image: naughtldy/circleci-node-awscli:8
    steps:
      - checkout
      - run:
          name: zip
          command: "zip -r master ../deployment-archive"
      - run:
          name: zip upload
          command: aws s3 cp master.zip s3://{バケット名}/{ファイル名} --region ap-northeast-1
      - run:
          name: Deploy Staging
          command: |
            aws deploy create-deployment \
              --application-name bot-ryuzu \
              --deployment-group-name ryuzu-prod \
              --s3-location bucket="{バケット名}",bundleType="zip",eTag=`aws s3api head-object --bucket {バケット名} --key {ファイル名} | jq .ETag`,key="{ファイル名}" \
              --region ap-northeast-1

workflows:
  version: 2
  deploy:
    jobs:
      - deploy:
          filters:
            branches:
              only: master

working_directory: ~/deployment-archive で、 CircleCI のソースコード展開先ディレクトリ名を deployment-archive にしたことで、 デプロイ先インスタンスdeployment-archiveソースコードが入り今まで通りにデプロイできるようになりました。