Azure Web Appsお勉強メモ(2)Azure Web AppsにてデプロイするDockerイメージをGitHub Actionsで作成してAzure Container Registryにpushする

はじめに

先週からAzure Web AppsにRailsアプリを動かすことをやっています。動かすことは簡単にできたのですが、色々と手作業が多かったのでちょっとでも自動化しようと試してみました。

先週の内容は以下を参照してください。

Dockerイメージを作成する

手始めにDockerイメージを自動ビルドするようにします。DockerHubにはAutobuildという機能がありましたが、先日の発表で無料ではできなくなりました。

www.docker.com

そこで、GitHub Actionsを使って実装したいと思います。以下のドキュメントが参考になりました。

docs.microsoft.com

上のドキュメントではpushするごとにイメージを作りますが、GitのタグをDockerイメージのタグと紐付けるため、少し修正します。

name: Create Docker Image

on:
  push:
    tags:
      - v*

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - run: |
        IMAGE_TAG=$(echo ${{ github.ref }} | sed -e 's/refs\/tags\///')
        docker build -f Dockerfile.prd -t イメージ名:$IMAGE_TAG .

タグ名を取得するには、${{ github.ref }}を使えば良さそうです。詳しくは以下のドキュメントを参照してください。

docs.github.com

DockerイメージをAzure Container Registryにpushする

Dockerイメージが作れたので、Azure Container Registryにイメージをpushします。Azure Container Registryには複数の認証方式があるようです。

docs.microsoft.com

docker loginコマンドを使う場合、管理者ユーザを使うのがいちばんお手軽っぽいですが、CI/CD上で使うにはあまりよくない気がしたので、サービスプリンシパルを使う方式をとることにします。

サービスプリンシパルを使う場合については、丁寧なドキュメントがあるので、これに沿ったらできそうです。

docs.microsoft.com

なお、上記ドキュメント中にあるSP_PASSWD=$(az ad sp create-for-rbac --name http://$SERVICE_PRINCIPAL_NAME --scopes $ACR_REGISTRY_ID --role acrpull --query password --output tsv)SP_PASSWD=$(az ad sp create-for-rbac --name http://$SERVICE_PRINCIPAL_NAME --scopes $ACR_REGISTRY_ID --role acrpush --query password --output tsv)にしないと、イメージのpushができないので注意です。

ただ、私がやったところ、SP_APP_ID=$(az ad sp show --id http://$SERVICE_PRINCIPAL_NAME --query appId --output tsv)を実行した時にERROR: Service principal 'xxxxxxx' doesn't existと出てしまいました。

f:id:miyohide:20210620185216j:plain

アプリケーションIDを取れば良いので、Azure ADの「アプリの登録」画面から当該のものを選択してアプリケーションIDを取得しました。

f:id:miyohide:20210620185720j:plain

これでdocker loginコマンドのユーザー名とパスワードに相当するものが得られたので、それを使ってログインしてpushすればOKです。テストとして手元でやってみると無事、pushできました。

f:id:miyohide:20210620190047p:plain