はじめに
先週からAzure Web AppsにRailsアプリを動かすことをやっています。動かすことは簡単にできたのですが、色々と手作業が多かったのでちょっとでも自動化しようと試してみました。
先週の内容は以下を参照してください。
Dockerイメージを作成する
手始めにDockerイメージを自動ビルドするようにします。DockerHubにはAutobuildという機能がありましたが、先日の発表で無料ではできなくなりました。
そこで、GitHub Actionsを使って実装したいと思います。以下のドキュメントが参考になりました。
上のドキュメントでは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 }}
を使えば良さそうです。詳しくは以下のドキュメントを参照してください。
DockerイメージをAzure Container Registryにpushする
Dockerイメージが作れたので、Azure Container Registryにイメージをpushします。Azure Container Registryには複数の認証方式があるようです。
docker login
コマンドを使う場合、管理者ユーザを使うのがいちばんお手軽っぽいですが、CI/CD上で使うにはあまりよくない気がしたので、サービスプリンシパルを使う方式をとることにします。
サービスプリンシパルを使う場合については、丁寧なドキュメントがあるので、これに沿ったらできそうです。
なお、上記ドキュメント中にある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
と出てしまいました。
アプリケーションIDを取れば良いので、Azure ADの「アプリの登録」画面から当該のものを選択してアプリケーションIDを取得しました。
これでdocker login
コマンドのユーザー名とパスワードに相当するものが得られたので、それを使ってログインしてpushすればOKです。テストとして手元でやってみると無事、pushできました。