次の方法で共有


Azure Pipelines を使用して App Service にカスタム コンテナーをデプロイする

Azure DevOps を使うと、無料のワークフローでコードをホスト、ビルド、計画、テストできます。 これらのワークフローの 1 つとして Azure Pipelines を使用すると、任意のプラットフォームとクラウドで機能する CI/CD によってアプリケーションをデプロイできます。 パイプラインは、リポジトリのルート ディレクトリ内の YAML ファイルとして定義されます。

この記事では、Azure Pipelines を使って、Azure DevOps で Git リポジトリから App Service に Windows コンテナー アプリケーションをデプロイします。 サポート dockerfile が Azure DevOps に含まれる .NET アプリケーションが既に存在するものとします。

前提条件

サービス接続を追加する

テンプレートを作成するときに接続の選択と検証を求められるため、パイプラインを作成する前にまず、サービス接続を作成する必要があります。 サービス接続を使うと、タスク テンプレートを使うときに、任意のレジストリ (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 を含むリポジトリを作成したら、次の手順のようにしてパイプラインを作成できます。

  1. 左側のメニュー バーで [パイプライン] に移動して、[パイプラインの作成] ボタンをクリックします
  2. 次の画面で、リポジトリ オプションとして [Azure Repos Git] を選んで、コードがあるリポジトリを選びます
  3. [構成] タブで、[スタート パイプライン] オプションを選びます
  4. 次の [レビュー] タブで、[保存] ボタンをクリックします

イメージをビルドして 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'