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: 'あなたのサービス接続番号'
新しいパイプラインを作成する
.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'