Gitea&DroneでCI/CD環境構築 や Gitea&Drone&リバースプロキシ で構築した環境を Azure の仮想マシン上に作成し、
処理ソースを git push すれば Azure リソースを自動でデプロイする仕組みを構築する。
尚、Gitea、Drone の構築に関しては Gitea&DroneでCI/CD環境構築 や Gitea&Drone&リバースプロキシ で実施した内容と変わらない為、
当記事では Azureリソースの デプロイや再起動に係る事項のみを記載する事とする。(下図のオレンジ枠のテキスト)
Azure CLI がセットアップ済みの docker イメージが公式で提供されているので、これを利用する。
(参考: Docker コンテナーでの Azure CLI の実行 )
.drone.yml
kind: pipeline type: docker name: default steps: - name: build image: .... commands: - "....." when: branch: - master - name: deploy # Azure CLI が利用できる dockerイメージ image: mcr.microsoft.com/azure-cli # az コマンドの発行 commands: - "az ....." - "az ....." when: branch: - master
az コマンドから Azureリソースを扱うには、事前に az login が必要になるが、このようなケース(自動運転)ではどのようなログイン方法が最適なのか。
以下のドキュメントをみる限り、サービス プリンシパルを使ってサインインするのが良さそう。
https://docs.microsoft.com/ja-jp/cli/azure/authenticate-azure-cli?view=azure-cli-latest#sign-in-with-a-service-principal
以下、抜粋
サービス プリンシパルの作成 及び 利用方法については、別記事 Azureサービスプリンシパルの使用 に記載している為、ここでは省略する。
証明書ベースのサービスプリンシパルを使用して az login をする際のコマンドは以下のようになる。
az login --service-principal -u http://サービスプリンシパル名 -p ./my_cert.pem --tenant テナント
実際の .drone.yml は以下のようになる。( 参考: https://docker-runner.docs.drone.io/configuration/volumes/host/ )
.drone.yml
kind: pipeline type: docker name: default steps: - name: build image: alpine commands: - "echo build!" when: branch: - master - name: deploy image: mcr.microsoft.com/azure-cli # 設定した volumes を runner 側の任意のpathにマウントする volumes: - name: pemfile path: /tmp/my_cert.pem commands: - "echo deploy!" - "az login --service-principal -u http://サービスプリンシパル名 -p /tmp/my_cert.pem --tenant テナントID >/dev/null" - "az vm list-ip-addresses -o table" when: branch: - master # ホスト側にある証明書を runner 側で利用する為、 volumes の設定を行う volumes: - name: pemfile host: path: /path/to/my_cert.pem
volumes を使用するにはDrone側で対象のリポジトリを信頼済みとしておく必要があり、この操作は管理者でしか行う事ができない。
サービスプリンシパル名やテナントIDは環境変数を参照する方が良いと思う。
以下docker-compose での利用例。
.env
: AZ_DEPLOY_TENANT=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX AZ_DEPLOY_SP=http://xxxxxxxxxxxx AZ_SP_CERT=/tmp/my_cert.pem
docker-compose.yml
: drone-runner: image: drone/drone-runner-docker:latest hostname: drone-runner container_name: drone-runner : volumes: - ./.env:/etc/drone.env:ro : environment: : DRONE_RUNNER_ENV_FILE: "/etc/drone.env"
.drone.yml
commands: - "echo deploy!" - "az login --service-principal -u ${AZ_DEPLOY_SP} -p ${AZ_SP_CERT} --tenant ${AZ_DEPLOY_TENANT} >/dev/null"
概要のイメージで示した 各Azure リソースのデプロイを行う為の .drone.yml の例を記載しておく。
カスタムハンドラーを使用したGoの関数アプリをデプロイする例
kind: pipeline type: docker name: default steps: - name: build image: golang commands: - "GOOS=windows GOARCH=amd64 go build -o my_go_server" when: branch: - master - name: deploy image: mcr.microsoft.com/azure-cli volumes: - name: pemfile path: /tmp/my_cert.pem commands: - "echo deploy function app" - "zip -r /tmp/functions.zip *" - "az login --service-principal -u ${AZ_DEPLOY_SP} -p ${AZ_SP_CERT} --tenant ${AZ_DEPLOY_TENANT} >/dev/null" - "az functionapp deployment source config-zip -g リソースグループ名 -n 関数アプリ名 --src /tmp/functions.zip" when: branch: - master volumes: - name: pemfile host: path: /path/to/my_cert.pem
コンテナ版のApp Service をデプロイする例
kind: pipeline type: docker name: default steps: - name: "build and deploy" image: mcr.microsoft.com/azure-cli volumes: - name: pemfile path: /tmp/my_cert.pem commands: - "echo deploy app service" - "az login --service-principal -u ${AZ_DEPLOY_SP} -p ${AZ_SP_CERT} --tenant ${AZ_DEPLOY_TENANT} >/dev/null" - "az acr build --registry ACRレジストリ名 --image イメージ名 ." - "az webapp restart --g リソースグループ名 -n アプリ名" when: branch: - master volumes: - name: pemfile host: path: /path/to/my_cert.pem