CircleCIのManual Approvalを得てAzure App Serviceのデプロイスロットをスワップさせる

この記事はCircleCI Advent Calendar 2020 - Qiitaの19日目の記事です。 qiita.com

今回はCircleCIのManual Approvalを使用してAzure App Serviceのデプロイスロットをスワップさせるところをやっていきたいと思います。

やりたいこと

  1. Dockerイメージのビルド、Azure Container RegistroyへDockerイメージをPush
  2. StagingのDockerイメージの参照先の変更(Dockerイメージのバージョン変更)
  3. SlackにManual Approvelの通知
  4. Manual Approvelが承認されれば、ProductionとStagingのデプロイスロットのスワップを実行

Azure App Serviceのスロットの機能に関してはこちらを参考にしてください。 docs.microsoft.com docs.microsoft.com

サンプルコード

Rubyの軽量フレームワークであるSinatraをAzure Web App for Containerにデプロイしてみました。 github.com 今回はこちらを使って、ワークフローの構築をしていきます。

1. DockerイメージのBuild / Push

Dockerコマンドを用いてイメージのBuild、Azure Container RegistroyへのPushを行います。 Dockerイメージのバージョン管理は、CircleCIで用意されている環境変数CIRCLE_SHA1で現在のビルドの最新コミットのSHA1ハッシュを参照できるので、こちらをDockerイメージのタグとして使用します。

setup_remote_dockerを実行することでリモート環境が作成され、完全に隔離された環境でDockerコマンドを実行できます。

jobs:
  build-push:
    steps:
      - checkout
      - setup_remote_docker
      - run:
          name: Build Docker image
          command: docker build -t $ACR_SERVER/$ACR_REPOSITORY:$CIRCLE_SHA1 .
      - run:
          name: Push Docker image
          command: |
            docker login $ACR_SERVER -u $ACR_LOGIN -p $ACR_PASSWORD
            docker push $ACR_SERVER/$ACR_REPOSITORY:$CIRCLE_SHA1

2. StagingのDockerイメージの参照先の変更

StagingのDockerイメージの参照先の変更や、後述のスワップの実行にはAzure CLIを使用していきます。

CircleCIでAzure CLIを実行させるにはOrbsのcircleci/azure-cliを使用するとよさそうです。Orbsめっちゃ便利!!!

az webapp config container setコマンドでStaging環境のDockerイメージの参照先を変更することができます。 docs.microsoft.com

orbs:
  azure-cli: circleci/azure-cli@1.1.0

jobs:
  build-push:
    executor: azure-cli/default
    steps:
      - azure-cli/install
      - azure-cli/login-with-service-principal
      - checkout
      - setup_remote_docker
      - run:
          name: Build Docker image
          command: docker build -t $ACR_SERVER/$ACR_REPOSITORY:$CIRCLE_SHA1 .
      - run:
          name: Push Docker image
          command: |
            docker login $ACR_SERVER -u $ACR_LOGIN -p $ACR_PASSWORD
            docker push $ACR_SERVER/$ACR_REPOSITORY:$CIRCLE_SHA1
            az webapp config container set -c "$ACR_SERVER/$ACR_REPOSITORY:$CIRCLE_SHA1" -p $ACR_PASSWORD -r https://$ACR_SERVER -u $ACR_LOGIN -n $AZURE_APP_NAME -s staging -g $AZURE_RESOURCE_GROUP

executorではazure-cli/azure-dockerを使用すると、Azure CLIが既にインストールされているのでこちらを使いたかったのですが、Dockerコマンドが使えなくdocker build等の作業が行えないので、こちらのJobではazure-cli/defaultの方を使用します。

3. SlackにManual Approvelの通知

Slackの通知にもOrbsが用意されているのでこちらを使用します。 Manual Approval用でワークフローを一時停止しワークフローへのリンクを含むSlack通知を送信するようなJobが最初から用意されてたので、そのまま使いたいと思います。

orbs:
  azure-cli: circleci/azure-cli@1.1.0
  slack: circleci/slack@4.1.4

jobs:

・・・

workflows:
  version: 2
  deploy:
    jobs:
      - build-push:
          filters:
            branches:
              only:
                - main
      - slack/on-hold:
          requires:
            - build-push
      - approval:
          type: approval
          requires:
            - slack/on-hold

こんな感じで承認のためのSlack通知が送信されます。 f:id:rnakamine:20201220094456p:plain

ここからすぐ承認ボタンのところまでいけるのでかなり便利です。 f:id:rnakamine:20201220095027p:plain

4. Manual Approvelが承認されれば、ProductionとStagingのデプロイスロットのスワップを実行

スワップの実行はAzure CLIaz webapp deployment slot swapコマンドを使用して実行させることができます。

docs.microsoft.com

version: 2.1

orbs:
  azure-cli: circleci/azure-cli@1.1.0
  slack: circleci/slack@4.1.4

jobs:

・・・

  swap:
    executor: azure-cli/azure-docker
    steps:
      - azure-cli/login-with-service-principal
      - run:
          name: Slot swap
          command: az webapp deployment slot swap -g $AZURE_RESOURCE_GROUP -n $AZURE_APP_NAME --slot staging

workflows:
  version: 2
  deploy:
    jobs:

・・・

      - swap:
          requires:
            - approval

先ほどの承認をボタンを押すことで、ProductionとStagingのデプロイスロットがスワップされ、ブルーグリーンデプロイ的なことができるようになります。

まとめ

Manual Approval、Orbsを今回初めて使ってみてとても便利だなと感じました。 CircleCI使用歴があまりないので、案外ハマるかなと思っていたのですが、 Configファイルも結構直感的に書けたので特に引っかかることなく進めることができました!