GitHub + Azure Container Registry Build + Azure Web App for Containers でコンテナ化された Web アプリを自動デプロイする

07 October 2018
#Azure#ACR Build#Azure Container Registry#Azure Web App#Azure Web App for Containers#Docker#GitHub

GitHub プッシュから自動的に Docker イメージをビルドして Azure にデプロイするというのを試してみました。

Docker イメージの自動的なビルドには Azure Container Registry Build を使用し、イメージのレジストリには Azure Container Registry を使用します。 そして、そのイメージを Azure Web App for Containers に自動デプロイするように設定することで、Webアプリのソースコード変更を GitHub にプッシュすると自動的に Web App に変更が反映されるという簡素な CI/CD の実現を目指します。

1. 準備

まずは、Azure Web App 上で公開する Webアプリとその Dockerfile を作成し、GitHub にプッシュします。

1.1 Web アプリケーションを作成

今回は、 Go 言語で「It works!」と表示するだけのシンプルな Webアプリ(というか Webサーバ)を作成します。ファイル名は server.go としました。
package main

import (
	"fmt"
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "It works!")
}

func main() {
	http.HandleFunc("/", handler)
	http.ListenAndServe(":80", nil)
}

1.2 Dockerfile を作成

server.go と同じディレクトリに次の Dockerfile を作成します。golang イメージを使用して server.go を起動するだけのシンプルな Dockerfile です。
FROM golang:latest

WORKDIR /go
COPY . /go

EXPOSE 80
CMD ["go", "run", "server.go"]

1.3 GitHub にプッシュ

GitHub にリポジトリを作成し、server.go と Dockerfile をプッシュします。
git init
git add server.go Dockerfile
git commit -m "first commit"
git remote add origin <作成した GitHub のリポジトリ>
git push origin master

1.4 GitHub で Personal Access Tokenを取得

https://github.com/settings/developers にアクセスして Personal Access Token (PAT) を生成します。 この PAT は ACR Build がリポジトリにアクセスするために使用されます。

repo:statuspublic_repo にチェックが必要です。

生成されたトークンは後で使うためメモしておいてください。

以上で準備は完了です。

2. Azure Container Registry を設定

続いて、GitHubリポジトリから自動的にイメージをビルドするための設定を行います。

2.1 コンテナーレジストリを作成

Azure の Portal からコンテナーレジストリを作成します。

2.2 ビルドタスクを作成

ここからは、Azure Cloud Shell を使用して作業します。 Cloud Shell には Portal の右上にあるボタンからアクセスすることができます。

ビルドタスクは git のコミットなどによってトリガできるビルドの定義です。 ビルドタスクの作成には az acr build-task create コマンドを使用します。

az acr build-task create \
    --registry <コンテナーレジストリのレジストリ名> \
    --name <作成するタスクの名前> \
    --image <作成するイメージ名> \
    --context <リポジトリのURL> \
    --git-access-token <GitHubのPAT>

今回は、次のようなコマンドを実行しました。

az acr build-task create \
    --registry acrbuildwebapp \
    --name buildwebapp \
    --image webapp:latest \
    --context https://github.com/4423/acr-build-webapp \
    --git-access-token 0123456789abcedf0123456789abcdef

また、作成されるイメージのタグをユニークな値(ビルドID)にすることも可能です。 その場合は --image webapp:{{.Build.ID}} のように設定します。

ここまでの設定で、GitHub にコミットがプッシュされると、ビルドタスクがトリガされ、自動的にイメージがビルドされるようになりました。

2.3 ビルドタスクをテスト

ここで一度、イメージがビルドできるかどうか確認してみましょう。 手動でビルドタスクをトリガするには、次のコマンドを実行します。
az acr build-task run --registry acrbuildwebapp --name buildwebapp

ビルドに成功すると次のような表示になります。

また、次のコマンドを実行することで、完了したビルドの一覧を表示することができます。

az acr build-task list-builds --registry acrbuildwebapp --output table

3. Azure Web App for Containers を設定

3.1 Web App を作成

Portal から Web App を作成します。OS を Linux に設定し、公開を Docker Image に設定します。

コンテナーの構成では Image source を Azure Container Registry に設定し、デプロイするイメージを指定します。

App Service プランには、最も安価な B1プラン(30日間無料)を選択しました。

以上の設定を終えてデプロイを完了します。

3.2 テスト

Web App のデプロイを完了したら、ブラウザでアクセスしてみましょう。

It works! と表示されているのが確認できますね。

3.3 Continuous Deployment の設定

ACR Build によってイメージが更新されたら、Web App が自動的にイメージをデプロイするよう設定します。

Web App のコンテナーの設定から Continuous Deployment をオンにして、保存します。

4. 自動的なデプロイの確認

GitHub にプッシュした変更が自動的に反映されるか確認します。

server.go を適当に書き換えて、変更を GitHub にプッシュしてみましょう。ここでは「It works!」の文字列を「Hello, Azure!」書き換えてみます。

プッシュして(しばらく待って)から再び ブラウザでアクセスすると、表示される文字が変わっているのが確認できますね。

デプロイされたイメージをビルドしたときのログは、次のコマンドを Cloud Shell で実行することで確認できます。

az acr build-task logs --registry acrbuildwebapp

まとめ

Azure Container Registry を使用して GitHub にプッシュされた Dockerfile をビルドし、Azure Web App for Containers にデプロイするというのを試しました。

Container Registry はプライベートリポジトリなので個人的な開発にも使えそうですね。 あと、Web App はワンクリックで最新のイメージをプルしてくれるようになるので便利です(Container Instance とかだと自分で Webhook を設定しないといけないので)。

参考文献

4423.ch