はじめに
こんにちは、ACS事業部の吉川です。
前回の記事では、Azure Container AppsとGitHub Actionsを組み合わせてのCI/CDについて解説しました。
今回はAzure DevOpsとの組み合わせでのCI/CDについて解説します。
構成
以下の構成を例として解説を行います。
前回の構成からGitHubをAzure DevOpsに置き換えただけのシンプルな構成です。
リソースの作成
前回記事と同じなので、前回の内容をご覧になられた方は読み飛ばしていただいて構いません。
まずはリソースグループとAzure Container Registry(ACR)を作成します。
# リソース名とリージョンの定義 rgName=rg-sample acrName=acrsample location=japaneast # リソースグループ作成 az group create --location $location --name $rgName # ACR作成 az acr create --name $acrName -g $rgName -l $location --sku Basic
次にContainer Appsを作成していきますが、まずは Container Apps環境 を作成する必要があります。
# リソース名の定義 caeName=cae-sample # Container Apps環境作成 az containerapp env create --name $caeName -g $rgName -l $location
Container Apps環境ができあがったらContainer Appsを作成します。
Container Apps作成時に --registry-identity
および --registry-server
オプションを付与することで、マネージドIDを利用してACRからイメージをPullできるように設定してくれます。
# リソース名の定義 acaName=aca-sample # Container Apps作成 az containerapp create -n $acaName -g $rgName \ --environment $caeName \ --ingress external \ --target-port 80 \ --registry-identity system \ --registry-server ${acrName}.azurecr.io
上記のコマンドでContainer Appsを作成すると、以下のようなサンプル用コンテナが起動した状態となります。
Azure DevOpsの準備
土台となる環境が整ったら、次はAzure DevOpsの準備をします。
Azure Pipelinesでは外部のサービスとの連携のために Service connection を作成する必要があります。
まずは Azure Resource Manager(ARM) のService connectionを作成しましょう。
Azure DevOpsプロジェクトの Settings
から Pipelines
-> Service connections
と進み、Create service connection
ボタンをクリックします。
New service connection
の一覧から Azure Resource Manager
を選択します。
次の画面では Service principal (automatic)
を選択します。
(事前に作成しておいたサービスプリンシパルを利用することもできますが、今回はAzure DevOpsから自動生成します)
サブスクリプションとリソースグループを選択し名前を入力して Save
ボタンをクリックすると、Service connectionが作成されます。
続いて Azure Container Registry(ACR)用のService connectionも作成します。
New service connection
から Docker Registry
を選択します。
Registry typeで Azure Container Registry
を選択し、サブスクリプションを選択、Azure container registry欄はリソースの作成にて作成したACRを選択します。
Service Connectionの名前を入力し Save
ボタンをクリックして作成完了です。
Service connectionの次はEnvironmentを作成します。
名前を入力し、Resourceは None
を選択します。
Service connectionとEnvironmentを作成したら、以下の内容でPipelineのYAMLファイルを準備します。
variables
の値は準備した環境に合わせ適宜編集してください。
trigger: - main resources: - repo: self variables: armServiceConnection: 'service-connection-aca-sample' # ARMのService connection名 dockerRegistryServiceConnection: 'service-connection-acr' # ACRのService connection名 environmentName: 'environment-aca-sample' # Environment名 imageRepository: 'sampleapp' containerRegistry: 'acrsample.azurecr.io' dockerfilePath: '**/Dockerfile' tag: '$(Build.BuildId)' resourceGroupName: 'rg-sample' containerAppName: 'aca-sample' # Agent VM image name vmImageName: 'ubuntu-latest' stages: - stage: Build displayName: Build stage jobs: - job: Build displayName: Build pool: vmImage: $(vmImageName) steps: - task: Docker@2 displayName: Build and push an image to container registry inputs: command: buildAndPush repository: $(imageRepository) dockerfile: $(dockerfilePath) containerRegistry: $(dockerRegistryServiceConnection) tags: | $(tag) - stage: Deploy displayName: Deploy stage dependsOn: Build jobs: - deployment: Deploy displayName: Deploy pool: vmImage: $(vmImageName) environment: $(environmentName) strategy: runOnce: deploy: steps: - task: AzureCLI@2 displayName: Deploy to containerapp inputs: azureSubscription: $(armServiceConnection) scriptType: 'bash' scriptLocation: 'inlineScript' inlineScript: | az config set extension.use_dynamic_install=yes_without_prompt az containerapp update -n $(containerAppName) -g $(resourceGroupName) \ --image $(containerRegistry)/$(imageRepository):$(tag)
上記のYAMLをAzure Reposに配置してPipelineとして登録します。
なお、リポジトリ内のファイル配置は以下のディレクトリ構成とします。
├── pipelines │ └── build_and_deploy.yaml └── Dockerfile
Pipelineの実行
さて、登録したPipelineを実行してみましょう。
Dockerfileを以下のよう作成してmainブランチにPushします。
FROM nginx:latest
Pipelineの実行が完了したら…
Container Appsがビルドしたコンテナイメージに更新されていることが確認できます。
おわりに
前回に引き続きContainer AppsのCI/CDについて、コンテナイメージをビルドしデプロイするというごく単純な内容で例示しました。
Pipeline内でのデプロイ処理はAzure CLIを実行しているだけですので、他のCI/CDツールでも同様に実行可能かと思います。
これまでの内容では実行中のコンテナを置き換える形でしたが、Container Appsへのデプロイ手法には他のオプションがあります。 次回はそのあたりについて触れられればと思っております。お楽しみに!