Azure Web Appsお勉強メモ(6)Azure Container RegistryにpushしたらAzure Web Appsにデプロイする

はじめに

先日からAzure Web AppsにRailsアプリを動かすことをやっています。先日の記事でGitHub Actionsを使ってDockerイメージを作成してAzure Container Registryにpushすることはできました。

miyohide.hatenablog.com

今回は、Azure Web Appsへのデプロイを自動化します。

これまでの内容は以下を参照してください。

参考となる記事

何か参考になる記事はないものかと探していたら、マイクロソフトが以下の記事を公開していました。

docs.microsoft.com

この中でも、Azure Container RegistryのWebHookの機能がお手軽にできそうです。早速やってみます。

WebHookを作成する

上記の記事の通りに以下のコマンドをCloud Shellで実行します。

ci_cd_url=$(az webapp deployment container config --name <app-name> --resource-group <group-name> --enable-cd true --query CI_CD_URL --output tsv)

az acr webhook create --name <webhook-name> --registry <registry-name> --resource-group <group-name> --actions push --uri $ci_cd_url --scope '<image>:<tag>'

scopeの部分に何を設定すれば良いかわかりませんでしたが、image名:*で任意のタグでWebHookが起動するようです。

docs.microsoft.com

実際に作成してみると、以下のようにWebHookが作成されました。

f:id:miyohide:20210801140411p:plain

新しいバージョンにならない?

早速、新しいバージョンを作成してpushします。WebHookのログをみると、新しいバージョンを検知しているのですが、アプリは最新版になっていませんでした。

f:id:miyohide:20210801141236p:plain

Web Appsのデプロイログを見ると、WebHookの起動時刻である13:25(JST)(黒い画面では04:25(UTC))前後にDockerイメージが最新版かどうか見にいっているのですが、タグが古いままになっています(Web Appsのデプロイログでは0.0.14をみているが、WebHookでは0.0.15)。

f:id:miyohide:20210801141815j:plain

Azure Container Registryにpushしたときに発行されるWebHookにtagもついているのでAzure Web Apps側で見れないことはないと思うのですが、今のところ挙動としてはWebHook内のtagを反映してくれないようです。

docs.microsoft.com

対策

ということで、対策です。GitHub Actionsでpushしているバージョン番号付きのDockerイメージとは別にlatestとtagをつけたものを作成・pushすることにします。Azure Web Apps側ではlatestを見るようにします。

GitHub Actionsでの記述

GitHub Actionsでは以下の記述を追記します。

# 省略
# これまで設定していたバージョン番号付きのDockerイメージの生成
docker build -f Dockerfile.prd -t ${{ secrets.REGISTRY_SERVER }}/rails_template_sqlite3:$IMAGE_TAG .
docker push ${{ secrets.REGISTRY_SERVER }}/rails_template_sqlite3:$IMAGE_TAG
# latestタグをつける
docker tag ${{ secrets.REGISTRY_SERVER }}/rails_template_sqlite3:$IMAGE_TAG ${{ secrets.REGISTRY_SERVER }}/rails_template_sqlite3:latest
# latestタグをpushする
docker push ${{ secrets.REGISTRY_SERVER }}/rails_template_sqlite3:latest
# 省略

Azure Web Apps側の設定

タグをlatestに設定します。

f:id:miyohide:20210801142535j:plain

この時点で、Azure Container RegistryのWebHookが新しく作られました。先に作った二重起動になるので削除しておきます。

f:id:miyohide:20210801142736p:plain

再検証

ここまでできたので、再度新しいバージョンを作成して実行してみます。すると、Dockerイメージがpushされた時点でWebHookが起動されます。

f:id:miyohide:20210801142918p:plain

数秒後に、Azure Web Appsにおいて新しいバージョンがデプロイされたことを検知してイメージをpullしてくれました。

f:id:miyohide:20210801143054j:plain

もちろん、アプリも新しいバージョンに置き換わりました。