以前の記事で、Azure Pipelines を使って Azure Web Apps にデプロイする内容を記載しました。
gooner.hateblo.jp
今回は、Azure Web Apps for Containers 向けのパイプラインを構築します。Azure Web Apps との違いは少ないので、相違点のみを記載します。
パイプラインの全体設計
以前の記事と同様に、パイプラインは、自動デプロイされる開発環境向け(Commit Stage)と承認デプロイされる本番環境向け(Production Stage)を作ります。YAML を Build と Release を分けて、可変部をパラメータで切り替えできるテンプレートを作ることで再利用性を向上させます。
ビルド用パイプライン
ビルド用の build-pipelines.yml です。
parameters: imageName: '' dockerRegistryServiceConnection: '' imageRepository: '' dockerfilePath: '' tag: '' buildConfiguration: '' projects: '' testProjects: '' dotnetSdkVersion: '' jobs: - job: Build pool: vmImage: ${{parameters.imageName}} steps: - task: DotNetCoreCLI@2 displayName: 'Install .NET Core SDK $(dotnetSdkVersion)' inputs: packageType: 'sdk' version: $(dotnetSdkVersion) - task: DotNetCoreCLI@2 displayName: 'Build' inputs: command: 'build' projects: ${{parameters.projects}} arguments: '--configuration ${{parameters.buildConfiguration}}' - task: DotNetCoreCLI@2 displayName: 'Test' inputs: command: 'test' projects: ${{parameters.testProjects}} arguments: '--configuration ${{parameters.buildConfiguration}}' - task: Docker@2 displayName: 'Build and push an image to container registry' inputs: command: buildAndPush repository: ${{parameters.imageRepository}} dockerfile: ${{parameters.dockerfilePath}} containerRegistry: ${{parameters.dockerRegistryServiceConnection}} tags: | $(tag)
Azure Web Apps との違いは、Docker task の Docker@2
を使って、Docker build と Azure Container Registry への Push を行っている部分のみです。docs.microsoft.com
リリース用パイプライン
リリース用の release-pipelines.yml です。
parameters: imageName: '' azureSubscription: '' webAppsName: '' containerRegistry: '' imageRepository: '' tag: '' environment: '' webAppsSlotName: 'production' jobs: - deployment: Deploy_Azure_WebApps displayName: 'Release' pool: vmImage: ${{parameters.imageName}} environment: ${{parameters.environment}} strategy: runOnce: deploy: steps: - task: AzureWebAppContainer@1 displayName: 'Deploy to Azure Web Apps for Container' inputs: azureSubscription: ${{parameters.azureSubscription}} appName: ${{parameters.webAppsName}} containers: ${{parameters.containerRegistry}}/${{parameters.imageRepository}}:${{parameters.tag}} slotName: ${{parameters.webAppsSlotName}}
Azure Web Apps と違って、Azure Web App for Container task の AzureWebAppContainer@1
を使っています。
docs.microsoft.com
スワップは、Azure Web Apps 向けのパイプラインをそのまま使えます。
開発環境向けパイプライン
開発環境向けの azure-pipelines.yml です。
trigger: - main variables: - group: variable-group-commit - name: imageName value: 'ubuntu-latest' - name: azureSubscription value: 'AzureSponsorships' - name: dockerRegistryServiceConnection value: 'ACR' - name: imageRepository value: 'item-service' - name: dockerfilePath value: '$(Build.SourcesDirectory)/item-service/Dockerfile' - name: tag value: '$(Build.BuildId)' - name: containerRegistry value: 'gooner.azurecr.io' - name: environment value: 'Commit-Stage' - name: buildConfiguration value: 'Release' - name: projects value: '**/item-service.csproj' - name: testProjects value: '**/item-service.Tests.csproj' - name: dotnetSdkVersion value: '5.0.x' stages: - stage: Build jobs: - template: pipelines/build-pipelines.yml parameters: imageName: $(imageName) dockerRegistryServiceConnection: $(dockerRegistryServiceConnection) imageRepository: $(imageRepository) dockerfilePath: $(dockerfilePath) tag: $(tag) buildConfiguration: $(buildConfiguration) projects: $(projects) testProjects: $(testProjects) dotnetSdkVersion: $(dotnetSdkVersion) - stage: Release dependsOn: - Build condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main')) jobs: - template: pipelines/release-pipelines.yml parameters: imageName: $(imageName) azureSubscription: $(azureSubscription) webAppsName: $(webAppsName) containerRegistry: $(containerRegistry) imageRepository: $(imageRepository) tag: $(tag) environment: $(environment)
Azure Web Apps との違いは、ACR のリポジトリ名や Dockerfile の場所を指定している部分です。Docker Image のタグは、パイプラインの BuildId を使っています。ACR の Service Connection は、あらかじめ作成しておきましょう。
本番環境向けパイプラインは、リリース前の承認と Deployment Slot を使ったスワップが追加されるくらいで、大きな違いはありません。
まとめ
リポジトリへのマージがトリガーとなり、ビルドとリリースのパイプラインが実行され、Azure Web Apps for Containers へのデプロイまでが自動で実行されます。
こちらから、パイプライン YAML の全体を確認できます。
github.com
余談
公式ドキュメントで Azure Web Apps for Containers の CI/CD を調べると、ACR Webhook の記事が見つかります。
docs.microsoft.com
この Webhook は Docker Image のタグが固定なので、はっきり言って使えません。どうやらコンテナを再起動するだけの Webhook みたいです。
latest タグで固定した CI/CD はやりたくないので、結局 Azure Pipelines YAML を書くことになります。これは便利そうだと思って試したときの残念な感じが辛かった・・・