CircleCI 2.1からのOrbでdocker buildしてECRにpushし、Slackに通知させる

circleci

CircleCI 2.1からOrbというjobをパッケージ化したものが使えるようになり、 自分でjobを書かずとも様々な処理を実行させることができるようになった。

CircleCI 2.0でDocker imageをbuildしてタグを付けてContainer Registryに上げる - sambaiz-net

今回は

を使ってdocker buildしてECRにpushし、バージョンタグが付いている場合はSlackに通知させる。

AWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYを環境変数に入れて、ECRのリポジトリを作成し、 SlackのwebhookのURLを発行しておく。

version: 2.1
orbs:
  aws-ecr: circleci/[email protected]
  slack: circleci/[email protected]

executors:
  default:
    machine: true
    environment:
      ECR_REPO: 'test-ecr-push'
      AWS_ECR_ACCOUNT_URL: '<account_id>.dkr.ecr.<region>.amazonaws.com'
      AWS_REGION: '<region>'
      CLUSTER_NAME: 'test'

jobs:
  notify_slack:
    executor: default
    steps:
      - slack/status:
          success_message: '${ECR_REPO}:${CIRCLE_TAG} was released'
          webhook: 'https://hooks.slack.com/services/******'

workflows:
  build-push:
    jobs:
      - aws-ecr/build_and_push_image:
          name: &build_version 'build-version'
          executor: default
          repo: '${ECR_REPO}'
          tag: '${CIRCLE_TAG}'
          filters:
            branches:
              ignore: /.*/
            tags:
              only: /^v.*/
      - aws-ecr/build_and_push_image:
          name: 'build-latest'
          executor: default
          repo: '${ECR_REPO}'
          tag: latest
          filters:
            branches:
              ignore: /.*/
            tags:
              only: /^v.*/
      - aws-ecr/build_and_push_image:
          name: 'build-hash'
          executor: default
          repo: '${ECR_REPO}'
          tag: '${CIRCLE_SHA1}'
      - notify_slack:
          requires:
            - *build_version
          filters:
            branches:
              ignore: /.*/
            tags:
              only: /^v.*/

これだけでAWS CLIのインストールやDockerのセットアップから一通りやってくれる。

aws-ecr/build_and_push_imageの内容

Slackへも通知される。

Slack通知

同じjobを複数走らせる場合にrequiresで指定するにはnameが必須になる。 そうでなくてもworkflowで見やすくなるので付けておいた方が良い。 環境変数の記述をjob間で共有するのに、これも2.1から追加されたexecutorを使っている。