この記事では、Azure Repos Git リポジトリから Windows コンテナー アプリケーションを Azure App Service に Azure Pipelines を使用して継続的インテグレーションと継続的デリバリー (CI/CD) としてデプロイする方法について説明します。 Azure ReposとAzure Pipelinesは、任意のプラットフォームとクラウドを使用してコードをホスト、ビルド、計画、テストできる無料のAzure DevOps サービスです。 パイプラインは、リポジトリのルート ディレクトリ内の YAML ファイルとして定義されます。
前提条件
- Azure Container Registry レジストリ インスタンスと、Azure App Service で作成された Web アプリを持つAzure アカウント。 無料でAzureアカウントを作成。
- Azure DevOps組織とプロジェクト。Docker コンテナーで実行されるWindows アプリと、サポートする Dockerfile がプロジェクト内の Azure Repos リポジトリにチェックインされています。
- Azure リソースおよび Azure DevOps プロジェクト、パイプライン、リポジトリ、サービス接続を作成および管理するための適切なユーザー ロールまたはアクセス許可。 詳細については、「manage security in Azure Pipelines」を参照してください。
サービス接続を追加する
このパイプラインを作成する前に、Azure Container RegistryへのAzure サービス接続を作成する必要があります。 Azure DevOpsで、プロジェクトの Project Settings を選択し、サービス接続の作成の手順に従ってサービス接続を作成します。
このプロジェクトとパイプラインのサービス接続を作成するには、Docker Registry を選択し、レジストリの種類として Azure Container Registry を選択します。 サービス接続を作成したら、後の手順で使用する ID を コピーします。
パイプラインを作成して構成する
コンテナーの構築、レジストリへのプッシュ、App Service へのイメージのデプロイの手順を実行するパイプラインを作成して構成します。
次の手順に従ってパイプラインを作成します。
- Azure DevOpsのプロジェクトで、左側のナビゲーション メニューから Pipelines を選択し、Create または Create Pipeline を選択します。
- コードはどこにありますか画面で、Azure Repos Gitを選択します。
- [ リポジトリの選択 ] 画面で、アプリを含むリポジトリを選択します。
- [ パイプラインの構成 ] 画面で、[ スターター パイプライン] を選択します。
- 右上にある [保存して実行] の横にあるドロップダウン矢印を選択し、[ 保存] を選択して、もう一度 [保存] を選択します。 パイプラインはまだ実行しないでください。
変数を作成する
パイプライン変数を作成して、頻繁に使用される値を再利用したり、他のユーザーがアクセスしたくない安全な情報を保護したりできます。 詳細については、「変数の定義」をご覧ください。
パイプライン ページの右上にある [編集] を選択し、編集ページの右上にある [変数 ] を選択します。
[ 変数 ] 画面で、[ 新しい変数] を選択します。
プレースホルダー値に独自の情報を使用して、次の名前と値のペアを追加します。 各変数を追加した後、[ OK] を 選択し、 + を選択して次の変数を追加します。 値がシークレットの場合は、[ この値のシークレットを保持する] チェック ボックスをオンにします。
- vmImageName: windows-latest
- イメージリポジトリ: <リポジトリ名>
- dockerfilePath: $(Build.SourcesDirectory)/<folder-path>/Dockerfile
- dockerRegistryServiceConnection: <service-connection-ID>
変数を追加した後、[変数] 画面で [保存] を選択し、パイプライン ページでもう一度 [保存] を選択します。
イメージをビルドしてプッシュするタスクを追加する
azure-pipelines.yml スターター ファイル内のすべての既存のコードを次のコードに置き換えます。 このコードは、イメージをビルドしてAzure Container Registryにプッシュする Docker タスクを追加します。 このコードでは、 $(<variable-name>) 構文を使用して、前に設定した変数を呼び出します。
trigger:
- main
pool:
vmImage:
$(vmImageName)
stages:
- 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)
App Service デプロイ タスクを追加する
Azure App Serviceに展開タスクを追加します。 このタスクでは、Azure サブスクリプション名、Web アプリ名、コンテナー レジストリ名を指定する必要があります。
次のコードをファイルの末尾に追加して、 azure-pipelines.yml ファイルにデプロイ ステージを追加します。
- stage: Deploy displayName: Deploy to App Service jobs: - job: Deploy displayName: Deploy pool: vmImage: $(vmImageName) steps:ファイルの末尾にある新しい行にカーソルを置き、必要に応じて右側の [アシスタントの表示 ] アイコンを選択して [タスク ] ウィンドウを表示します。 Tasks ペインで、Azure App Service deploy タスクを検索して選択します。
Azure App Service deploy 画面で、次の情報を入力します。
Connection type :Azure Resource Manager を選択。- Azure サブスクリプション: Azureサブスクリプションの名前と ID を選択します。 必要に応じて、[承認] を選択 します。
- App Service type: Web App for Containers (Windows) を選択します。
- App Service 名: App Service Web アプリ名を選択または入力します。
- Registry または Namespace: Azure Container Registry インスタンス名を入力します。
- イメージ: コードが格納されているリポジトリ名を入力します。
[] を選択し、[] を追加します。 次のコードは、プレースホルダーをあなたの値で置き換えたうえでファイルの末尾に追加します。
- task: AzureRmWebAppDeployment@4 inputs: ConnectionType: 'AzureRM' azureSubscription: '<your subscription name (subscription ID)>' appType: 'webAppHyperVContainer' WebAppName: '<your App Service web app name>' DockerNamespace: '<your Azure Container Registry instance name>' DockerRepository: '<your repository name>'
パイプラインを実行する
パイプラインはこれで動作する準備が整いました。
- [ 検証して保存] を選択し、もう一度 [保存] を選択します。
- [ 実行] を選択し、もう一度 [実行 ] を選択します。
パイプラインでは、Windows コンテナー イメージをビルドしてAzure Container Registryにプッシュし、そのイメージを App Service にデプロイする手順を実行します。
次のコードは、完全な azure-pipelines.yml パイプライン定義ファイルと値の例を示しています。
trigger:
- main
pool:
vmImage:
$(vmImageName)
stages:
- 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)
- stage: Deploy
displayName: Deploy to App Service
jobs:
- job: Deploy
displayName: Deploy
pool:
vmImage: $(vmImageName)
steps:
- task: AzureRmWebAppDeployment@4
inputs:
ConnectionType: 'AzureRM'
azureSubscription: 'mysubscription(00000000-0000-0000-0000-000000000000)'
appType: 'webAppHyperVContainer'
WebAppName: 'myWindowsDockerSample'
DockerNamespace: 'mycontainerregistry'
DockerRepository: 'myrepository'