Azure Pipelines を使用して App Service にカスタム コンテナーをデプロイする
Azure DevOps を使うと、無料のワークフローでコードをホスト、ビルド、計画、テストできます。 これらのワークフローの 1 つとして Azure Pipelines を使用すると、任意のプラットフォームとクラウドで機能する CI/CD によってアプリケーションをデプロイできます。 パイプラインは、リポジトリのルート ディレクトリ内の YAML ファイルとして定義されます。
この記事では、Azure Pipelines を使って、Azure DevOps で Git リポジトリから App Service に Windows コンテナー アプリケーションをデプロイします。 サポート dockerfile が Azure DevOps に含まれる .NET アプリケーションが既に存在するものとします。
前提条件
- アクティブなサブスクリプションが含まれる Azure アカウント。 無料でアカウントを作成できます。
- Azure DevOps 組織。 無料で作成できます。
- Azure Reposで Dockerfile がホストされている動作する Windows アプリ。
サービス接続を追加する
テンプレートを作成するときに接続の選択と検証を求められるため、パイプラインを作成する前にまず、サービス接続を作成する必要があります。 サービス接続を使うと、タスク テンプレートを使うときに、任意のレジストリ (ACR または Docker Hub) に接続できます。 新しいサービス接続を追加するときに、Docker レジストリ オプションを選びます。 次のフォームでは、関連する情報と共に Docker Hub または Azure Container Registry の選択を求められます。 このチュートリアルに従って行うには、Azure Container Registry を使います。 こちらの説明に従って、新しいサービス接続を作成できます。
シークレットをセキュリティで保護する
他のユーザーにアクセスさせたくない機密情報を使っているため、変数を使って情報を保護します。 こちらの説明に従って、変数を作成します。
変数を追加するには、パイプラインの編集ビューの右上にある [保存] ボタンの横の [変数] ボタンをクリックします。 [新しい変数] ボタンを選んで、情報を入力します。 以下の変数を、各リソースからの適切な独自のシークレットと共に追加します。
- vmImageName: 'windows-latest'
- imageRepository: 'your-image-repo-name'
- dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
- dockerRegistryServiceConnection: 'your-service-connection-number'
新しいパイプラインを作成する
.NET アプリケーションとサポート dockerfile を含むリポジトリを作成したら、次の手順のようにしてパイプラインを作成できます。
- 左側のメニュー バーで [パイプライン] に移動して、[パイプラインの作成] ボタンをクリックします
- 次の画面で、リポジトリ オプションとして [Azure Repos Git] を選んで、コードがあるリポジトリを選びます
- [構成] タブで、[スタート パイプライン] オプションを選びます
- 次の [レビュー] タブで、[保存] ボタンをクリックします
イメージをビルドして Azure Container Registry にプッシュする
パイプラインを作成して保存したら、コンテナーのビルド、レジストリへのプッシュ、App Service へのイメージのデプロイの手順を実行するように、パイプラインを編集する必要があります。 始めるには、[パイプライン] メニューに移動し、作成したパイプラインを選んで、[編集] ボタンをクリックします。
まず、イメージをビルドできるように Docker タスクを追加する必要があります。 次のコードを追加し、Dockerfile: app/Dockerfile を実際の Dockerfile へのパスに置き換えます。
trigger:
- main
pool:
vmImage: 'windows-latest'
variables:
vmImageName: 'windows-latest'
imageRepository: 'your-image-repo-name'
dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
dockerRegistryServiceConnection: 'your-service-connection-number'
- stage: Build
displayName: Build and push stage
jobs:
- job: Build
displayName: Build job
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)
App Service デプロイ タスクを追加する
次に、デプロイ タスクを設定する必要があります。 これには、サブスクリプション名、アプリケーション名、コンテナー レジストリが必要です。 次のコードを貼り付けて、yaml ファイルに新しいステージを追加します。
- stage: Deploy
displayName: Deploy to App Service
jobs:
- job: Deploy
displayName: Deploy
pool:
vmImage: $(vmImageName)
steps:
次に、右上隅にある [アシスタントを表示する] タブに移動し、[Azure App Service のデプロイ] タスクを見つけて、次のフォームに入力します。
- 接続の種類: Azure Resource Manager
- Azure サブスクリプション: 自分のサブスクリプション名
- App Service の種類: Web App for Containers (Windows)
- App Service 名: 自分のアプリ名
- レジストリまたは名前空間: 自分の Azure Container Registry 名前空間
- イメージ: 自分の Azure Container Registry イメージ名
それらを入力したら、[追加] ボタンをクリックして、以下のタスクを追加します。
- task: AzureRmWebAppDeployment@4
inputs:
ConnectionType: 'AzureRM'
azureSubscription: 'my-subscription-name'
appType: 'webAppHyperVContainer'
WebAppName: 'my-app-name'
DockerNamespace: 'myregsitry.azurecr.io'
DockerRepository: 'dotnetframework:12'
タスクを追加すると、パイプラインを実行できる状態になります。 [検証と保存] ボタンをクリックして、パイプラインを実行します。 このパイプラインは、Windows コンテナー イメージをビルドして Azure Container Registry にプッシュし、そのイメージを App Service にデプロイする手順を実行します。
完全な yaml ファイルの例を次に示します。
trigger:
- main
pool:
vmImage: 'windows-latest'
variables:
vmImageName: 'windows-latest'
imageRepository: 'your-image-repo-name'
dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
dockerRegistryServiceConnection: 'your-service-connection-number'
- stage: Build
displayName: Build and push stage
jobs:
- job: Build
displayName: Build job
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 to App Service
jobs:
- job: Deploy
displayName: Deploy
pool:
vmImage: $(vmImageName)
steps:
- task: AzureRmWebAppDeployment@4
inputs:
ConnectionType: 'AzureRM'
azureSubscription: 'my-subscription-name'
appType: 'webAppHyperVContainer'
WebAppName: 'my-app-name'
DockerNamespace: 'myregsitry.azurecr.io'
DockerRepository: 'dotnetframework:12'