この記事はCircleCI Advent Calendar 2020 - Qiitaの19日目の記事です。 qiita.com
今回はCircleCIのManual Approvalを使用してAzure App Serviceのデプロイスロットをスワップさせるところをやっていきたいと思います。
やりたいこと
- Dockerイメージのビルド、Azure Container RegistroyへDockerイメージをPush
- StagingのDockerイメージの参照先の変更(Dockerイメージのバージョン変更)
- SlackにManual Approvelの通知
- 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通知が送信されます。
ここからすぐ承認ボタンのところまでいけるのでかなり便利です。
4. Manual Approvelが承認されれば、ProductionとStagingのデプロイスロットのスワップを実行
スワップの実行はAzure CLIのaz webapp deployment slot swap
コマンドを使用して実行させることができます。
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ファイルも結構直感的に書けたので特に引っかかることなく進めることができました!