Azure DevOps Services | Azure DevOps Server 2022
この記事では、 Azure Pipelines を使用して、Web アプリを Azure App Service に自動的にビルド、テスト、デプロイする方法について説明します。 リポジトリの指定されたブランチにコード変更をチェックインするたびに実行される継続的インテグレーションおよび継続的デリバリー (CI/CD) パイプラインを設定できます。
パイプラインは、 ステージ、 ジョブ、およびステップで構成 されます。 ステップはパイプラインの最小の構成要素であり、事前にパッケージ化された スクリプトであるスクリプト または タスクにすることができます。 パイプラインを構成する主要な概念とコンポーネントの詳細については、「 主要な Azure Pipelines の概念」を参照してください。
パイプラインで Azure Web App タスクを使用して、App Service にデプロイできます。 デプロイでの XML パラメーターの使用など、より複雑なシナリオでは、 Azure App Service デプロイ タスクを使用できます。
[前提条件]
GitHub または Azure Repos でホストされているコードを含む、動作する Azure App Service アプリ。 次のクイック スタート記事のいずれかを使用して、サンプル アプリを作成できます。
- ASP.NET Core: Azure で ASP.NET Core Web アプリを作成する
 - ASP.NET: Azure で ASP.NET Framework Web アプリを作成する
 - JavaScript: Azure App Service で Node.js Web アプリを作成する
 - Java: Azure App Service で Java アプリを作成する
 - Python: Azure App Service で Python アプリを作成する
 
Microsoft がホストするエージェントでパイプラインを実行できる Azure DevOps 組織。 Free レベルの並列ジョブを要求するか、並列ジョブを購入する必要があります。 詳しくは、「並列ジョブの設定と支払いについて」をご覧ください。
パイプラインと Azure サービス接続を作成して承認するアクセス許可を持つ Azure DevOps 組織で作成されたプロジェクト。 Azure DevOps でプロジェクトを作成します。
Important
GitHub の手順中に、 GitHub サービス接続 を作成するか、GitHub にリダイレクトしてサインイン、Azure Pipelines GitHub アプリのインストール、 Azure Pipelines の承認、GitHub 組織への認証を求められる場合があります。 画面の指示に従って、必要なプロセスを完了します。 詳細については、「Github リポジトリへのアクセス」を参照してください。
パイプラインを作成する
このセクションのコード例は、ASP.NET Core Web アプリ用です。 この手順は、他のフレームワークに合わせて調整できます。 Azure Pipelines エコシステムのサポートの詳細については、 Azure Pipelines エコシステムの例を参照してください。
コード リポジトリに azure-pipelines.yml YAML ファイルを作成してパイプラインを定義します。
- Azure DevOps プロジェクトの左側のナビゲーション メニューで、[ パイプライン] を選択します。
 - [パイプライン] ページ で 、[ 新しいパイプライン] を選択するか、このパイプラインがプロジェクトの最初のパイプラインである場合は [パイプラインの 作成 ] を選択します。
 - [コードの場所] 画面で、ソース コードの場所 (Azure Repos Git または GitHub) を選択します。 必要に応じて、GitHub にサインインします。
 - [ リポジトリの選択 ] 画面で、コード リポジトリを選択します。
 - [ パイプラインの構成 ] 画面で、[ スターター パイプライン] を選択します。
 
.NET Core (DotNetCoreCLI@2) タスクをパイプラインに追加し、アプリをビルドして発行します。
- パイプライン YAML の確認 画面で、 
steps:行の後にあるすべてのコードを削除します。 - ファイルの末尾を選択し、右側にある [アシスタントの表示 ] を選択します。
 - [ タスク] で 、[ .NET Core] を選択します。
 - .NET Core 構成画面の Azure Resource Manager 接続で、Azure サブスクリプションを選択し、[承認] を選択して必要なサービス接続を作成します。
 - [ コマンド] で [発行] を選択 します。
 - [ Web プロジェクトの発行 ] チェック ボックスと [ Zip 発行済みプロジェクト ] チェック ボックスがオンになっていることを確認し、[ 追加] を選択します。
 - タスクが YAML パイプラインに表示されます。 YAML コードを確認して、動作を確認します。 準備ができたら、[ 保存して実行] を選択し、[ 保存して再度実行] を選択します。
 - ビルドの 概要 画面の [ ジョブ] で、[ 必要なアクセス許可 ] リンクを選択します。 [ チェック ] 画面で、[ 許可] を選択し、もう一度 [許可 ] を選択します。 ここでアクセス許可を付与すると、このパイプラインのすべての実行に対して承認したサービス接続の使用が許可されます。
 
パイプラインは、デプロイ ZIP ファイルを、次の手順で使用するデプロイ タスクの Azure 成果物として発行します。
デプロイ タスクを追加する
パイプラインが正常に実行されたら、デプロイ タスクを追加します。
- パイプラインの実行 の概要 画面で、右上にある [その他のアクション ] アイコンを選択し、[ パイプラインの編集] を選択します。
 - YAML ファイルの末尾を選択し、[タスク] リストに表示されていない場合は [アシスタントの表示] を選択します。
 - [タスク] ボックスの一覧で、Azure Web App タスクを検索して選択します。 または、 Azure App Service デプロイ タスクを使用することもできます。
 - Azure Web App 構成画面の Azure サブスクリプションで、前の手順で設定したのと同じサービス接続を選択します。 この接続を再認証する必要はありません。
 - [アプリの種類] で、コードに応じて [Azure Web App on Linux] または [Azure Web App on Windows] を選択します。
 - [アプリ名] で、App Service アプリ名を選択または入力します。
 - [] を選択し、[] を追加します。
 - [ 検証して保存] を選択し、[ 保存] を選択します。
 - [ 実行] を選択し、もう一度 [実行 ] を選択します。
 
完全な YAML パイプラインは、次のコードのようになります。
trigger:
- <branch-specification>
pool:
  vmImage: <agent-specification>
steps:
- task: DotNetCoreCLI@2
  inputs:
    azureSubscription: '<your-authorized-service-connection>'
    command: 'publish'
    publishWebProjects: true
- task: AzureWebApp@1
  inputs:
    azureSubscription: '<your-authorized-service-connection>'
    appType: 'webApp'
    appName: '<your-app-name>'
    package: '$(System.DefaultWorkingDirectory)/**/*.zip'
    deploymentMethod: 'auto'  
- 
              
azureSubscription: Azure サブスクリプションへの承認されたサービス接続の名前。 - 
              
appName: 既存のアプリの名前。 - 
              
package: App Service コンテンツを含むパッケージまたはフォルダーへのファイル パス。 ワイルドカードを利用できます。 
例示
次のセクションでは、さまざまな種類のビルド パイプラインとリリース パイプラインを作成する方法について説明します。
仮想アプリケーションへのデプロイ
              Azure Web App タスクは、Azure Web アプリのルート アプリケーションにデプロイされます。 
              VirtualApplication デプロイ タスクの  プロパティを使用して、特定の仮想アプリケーションにデプロイできます。
- task: AzureRmWebAppDeployment@5
  inputs:
    VirtualApplication: '<name of virtual application>'
              VirtualApplication は、Azure portal で構成された仮想アプリケーションの名前です。 詳細については、 Azure portal での App Service アプリの構成に関するページを参照してください。
スロットへのデプロイ
次の例は、ステージング スロットにデプロイしてから運用スロットにスワップする方法を示しています。
- task: AzureWebApp@1
  inputs:
    azureSubscription: '<service-connection-name>'
    appType: webAppLinux
    appName: '<app-name>'
    deployToSlotOrASE: true
    resourceGroupName: '<name of resource group>'
    slotName: staging
    package: '$(Build.ArtifactStagingDirectory)/**/*.zip'
- task: AzureAppServiceManage@0
  inputs:
    azureSubscription: '<service-connection-name>'
    WebAppName: '<app-name>'
    ResourceGroupName: '<name of resource group>'
    SourceSlot: staging
    SwapWithProduction: true
- 
              
azureSubscription: Azure サービス接続。 - 
              
appType: Linux 上の Web アプリにデプロイするwebAppLinuxなどの省略可能なアプリの種類。 - 
              
appName: 既存のアプリの名前。 - 
              
deployToSlotOrASE:ブーリアン。 既存のデプロイ スロットまたは App Service 環境にデプロイするかどうか。 - 
              
resourceGroupName: デプロイするリソース グループの名前。deployToSlotOrASEが true の場合は必須。 - 
              
slotName: デプロイするスロットの名前。deployToSlotOrASEが true の場合は必須。 既定値はproductionです。 - 
              
package: アプリの内容を含むパッケージまたはフォルダーへのファイル パス。 ワイルドカードを利用できます。 - 
              
SourceSlot:SwapWithProductionが true の場合に運用環境に送信されるスロット。 - 
              
SwapWithProduction:ブーリアン。 ソース スロットのトラフィックを運用環境にスワップするかどうか。 
複数の Web アプリにデプロイする
YAML ファイル内の ジョブ を使用して、デプロイのパイプラインを設定できます。 ジョブを使用すると、複数の Web アプリへのデプロイの順序を制御できます。
jobs:
- job: buildandtest
  pool:
    vmImage: ubuntu-latest
 
  steps:
  # publish an artifact called drop
  - task: PublishPipelineArtifact@1
    inputs:
      targetPath: '$(Build.ArtifactStagingDirectory)' 
      artifactName: drop
  
  # deploy to Azure Web App staging
  - task: AzureWebApp@1
    inputs:
      azureSubscription: '<service-connection-name>'
      appType: <app type>
      appName: '<staging-app-name>'
      deployToSlotOrASE: true
      resourceGroupName: <group-name>
      slotName: 'staging'
      package: '$(Build.ArtifactStagingDirectory)/**/*.zip'
- job: deploy
  dependsOn: buildandtest
  condition: succeeded()
  pool: 
    vmImage: ubuntu-latest
  
  steps:
    # download the artifact drop from the previous job
  - task: DownloadPipelineArtifact@2
    inputs:
      source: 'current'
      artifact: 'drop'
      path: '$(Pipeline.Workspace)'
  - task: AzureWebApp@1
    inputs:
      azureSubscription: '<service-connection-name>'
      appType: <app type>
      appName: '<production-app-name>'
      resourceGroupName: <group-name>
      package: '$(Pipeline.Workspace)/**/*.zip'
条件付きでデプロイする
YAML で条件付きでデプロイするには、次のいずれかの手法を使用します。
- 手順に条件を追加します。
 - デプロイ手順を別のジョブに分離し、そのジョブに条件を追加します。
 
次の例は、ステップ条件を使用して、メイン ブランチから作成された成功したビルドのみをデプロイする方法を示しています。
- task: AzureWebApp@1
  condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
  inputs:
    azureSubscription: '<service-connection-name>'
    appName: '<app-name>'
条件の詳細については、「条件の 指定」を参照してください。
Web 配置を使用したデプロイ
Azure App Service デプロイ タスクは、Web デプロイを使用して App Service にデプロイできます。
trigger:
- main
pool:
  vmImage: windows-latest
variables:
  buildConfiguration: 'Release'
steps:
- task: DotNetCoreCLI@2
  inputs:
    command: 'publish'
    publishWebProjects: true
    arguments: '--configuration $(buildConfiguration)'
    zipAfterPublish: true
- task: AzureRmWebAppDeployment@5
  inputs:
    ConnectionType: 'AzureRM'
    azureSubscription: '<service-connection-name>'
    appType: 'webApp'
    WebAppName: '<app-name>'
    packageForLinux: '$(System.DefaultWorkingDirectory)/**/*.zip'
    enableCustomDeployment: true
    DeploymentType: 'webDeploy'
よく寄せられる質問
AzureWebApp タスクと AzureRmWebAppDeployment タスクの違いは何ですか?
Azure Web App タスクは、Azure Web アプリにデプロイする最も簡単な方法です。 既定では、ルート アプリケーションを Azure Web アプリにデプロイします。
Azure App Service デプロイ タスクでは、次のようなより多くのカスタム シナリオを処理できます。
- 通常、インターネット インフォメーション サービス (IIS) の展開プロセスを使用する場合は、Web 配置を使用して展開します。
 - 仮想アプリケーションにデプロイする。
 - コンテナー アプリ、関数アプリ、Web ジョブ、API アプリ、モバイル アプリなど、他の種類のアプリにデプロイします。
 
注
個別の ファイル変換 タスクでは、Azure Pipelines で使用するファイル変換と変数の置換もサポートされています。 ファイル変換タスクを使用すると、任意の構成ファイルとパラメーター ファイルにファイル変換と変数置換を適用できます。
"無効な App Service パッケージまたはフォルダー パスが指定されました" というメッセージが表示されるのはなぜですか?
YAML パイプラインでは、ビルドされた Web パッケージを保存する場所と、デプロイ タスクで検索する場所が一致しない可能性があります。 既定の AzureWebApp タスクは、 $(System.DefaultWorkingDirectory)/**/*.zipからデプロイ用の Web パッケージを取得します。 Web パッケージが別の場所に保管されている場合は、 package パラメーターの値を変更します。
"Webdeploy オプションを使用した発行は、Windows エージェントを使用している場合にのみサポートされます" というメッセージが表示されるのはなぜですか?
このエラーは、Web Deploy を使用してデプロイするようにタスクを構成したが、エージェントが Windows を実行していない場合に、AzureRmWebAppDeployment タスクで発生します。 YAML vmImage パラメーターで Windows が指定されていることを確認します。
pool:
  vmImage: windows-latest
基本認証を無効にすると Web 配置が機能しないのはなぜですか?
Azure App Service デプロイ タスクで Microsoft Entra ID 認証を使用するためのトラブルシューティング情報については、「Windows エージェントからの Microsoft Entra ID 認証を使用して Azure App Service に Web デプロイできない」を参照してください。