はじめに
先日からAzure Web AppsにRailsアプリを動かすことをやっています。先日の記事でGitHub Actionsを使ってDockerイメージを作成してAzure Container Registryにpushすることはできました。
今回は、Azure Web Appsへのデプロイを自動化します。
これまでの内容は以下を参照してください。
- Azure Web Appsお勉強メモ(1)Azure Web AppsにてRailsアプリを動かす(2021年6月版) - miyohide's blog
- Azure Web Appsお勉強メモ(2)Azure Web AppsにてデプロイするDockerイメージをGitHub Actionsで作成してAzure Container Registryにpushする - miyohide's blog
- Azure Web Appsお勉強メモ(3)Azure Web AppsにてデプロイするDockerイメージをGitHub Actionsで作成してAzure Container Registryにpushする(2) - miyohide's blog
- Azure Web Appsお勉強メモ(4)Azure Web AppsにてデプロイするDockerイメージをAzure DevOpsで生成してAzure Container Registryに登録する - miyohide's blog
- Azure Web Appsお勉強メモ(5)Azure Web AppsにてデプロイしたDockerイメージにSSH接続する - miyohide's blog
参考となる記事
何か参考になる記事はないものかと探していたら、マイクロソフトが以下の記事を公開していました。
この中でも、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が起動するようです。
実際に作成してみると、以下のようにWebHookが作成されました。
新しいバージョンにならない?
早速、新しいバージョンを作成してpushします。WebHookのログをみると、新しいバージョンを検知しているのですが、アプリは最新版になっていませんでした。
Web Appsのデプロイログを見ると、WebHookの起動時刻である13:25(JST)(黒い画面では04:25(UTC))前後にDockerイメージが最新版かどうか見にいっているのですが、タグが古いままになっています(Web Appsのデプロイログでは0.0.14をみているが、WebHookでは0.0.15)。
Azure Container Registryにpushしたときに発行されるWebHookにtagもついているのでAzure Web Apps側で見れないことはないと思うのですが、今のところ挙動としてはWebHook内のtagを反映してくれないようです。
対策
ということで、対策です。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
に設定します。
この時点で、Azure Container RegistryのWebHookが新しく作られました。先に作った二重起動になるので削除しておきます。
再検証
ここまでできたので、再度新しいバージョンを作成して実行してみます。すると、Dockerイメージがpushされた時点でWebHookが起動されます。
数秒後に、Azure Web Appsにおいて新しいバージョンがデプロイされたことを検知してイメージをpullしてくれました。
もちろん、アプリも新しいバージョンに置き換わりました。