概要

Gitea&DroneでCI/CD環境構築Gitea&Drone&リバースプロキシ で構築した環境を Azure の仮想マシン上に作成し、
処理ソースを git push すれば Azure リソースを自動でデプロイする仕組みを構築する。

尚、Gitea、Drone の構築に関しては Gitea&DroneでCI/CD環境構築Gitea&Drone&リバースプロキシ で実施した内容と変わらない為、
当記事では Azureリソースの デプロイや再起動に係る事項のみを記載する事とする。(下図のオレンジ枠のテキスト)

[補足]
Azure Pipelines が利用できる場合は、多分そっちを利用した方が賢い。

azure_drone_image.png

目次

Drone Runner から 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 login するのか

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サービスプリンシパルの使用 に記載している為、ここでは省略する。

証明書を Drone runner に渡す方法

証明書ベースのサービスプリンシパルを使用して 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側で対象のリポジトリを信頼済みとしておく必要があり、この操作はDroneの管理者ユーザでしか行う事ができない。

drone_repo_trusted.png

補足

サービスプリンシパル名やテナント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

添付ファイル: filedrone_repo_trusted.png 1件 [詳細] fileazure_drone_image.png 1件 [詳細]

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-09-11 (金) 08:49:13 (11d)