App Service on Linux が GA する少し前に Azure Container Registry を使った自動デプロイが、Azure Portal から簡単に設定できるようになったとブログに上がってました。
Azure Portal から Continuous Deployment を On にすると Webhook の設定をしてくれます。
ドキュメントも用意されてますが、ACR 連携に関しては手動で Webhook を作る必要があると書いてあるので、まだ最新にはなっていないようです。
ACR への Push をトリガーにデプロイが行えると非常に捗りそうなので、いろいろと調べていました。しかし何故か上手くいきませんでしたが、最近いろいろと解決して動作するようになったので書きます。
Webhook はコンテナを再起動するだけ
Docker Hub や Azure Container Registry との連携用に用意されている Webhook は非常に単純な機能しか持っておらず、呼び出されたらコンテナを再起動するだけとなってます。
この挙動は Kudu の実装を見るとすぐにわかります。コンテナの再起動なので、毎回 Docker Image のタグを変更するような運用の場合は正しく動作しません。
タグを変える場合には Azure CLI を使ってコンテナイメージを切り替えるといった、これまで通りの処理が必要になります。CircleCI を使って実現する場合の例は以下の通り。
Docker Image のプッシュ先を ACR に変えるだけですが、サービスプリンシパルを作ったり、Azure CLI をインストールしたりと地味に面倒です。
Docker Image のタグは固定する
Webhook は設定を切り替えてくれることはないので、バージョン管理がそのままでは行えません。
仕方ないので App Service on Linux で Docker Hub や Azure Container Registry を使った CD を行う場合には、バージョン別のタグと latest を含めるようにします。
docker tag を使ってやれば良いだけです。バージョン別のタグを持っているので、最悪戻したい時には latest に push し直したり、設定からイメージを指定し直せばよいかなと思います。
latest タグを含めているので、App Service on Linux の設定からは latest を選びます。
この状態で Continuous Deployment を On にすると Azure Container Registry に Webhook が作成されます。今は Web App 名にハイフンが含まれていると上手く作成されないらしいので注意。
スコープとして Web App に設定した Image と Tag の組み合わせが設定されます。
この状態で latest タグに対してプッシュすると Webhook が実行されて、App Service on Linux 側でコンテナが再起動されます。このときに新しいイメージが pull されます。
なのでしばらくすると新しいコンテナが起動してデプロイが完了するという仕組みです。サービスプリンシパルや Azure CLI が必要なくなったので便利ですが、固定のイメージしか使えないのは少し不便だと思います。
Webhook のペイロードにはイメージの情報が含まれているので、それを読み取ってくれると思っていましたが当てが外れました。フィードバックしていきたい部分です。