Azure Pipelines を使用して App Service にデプロイする

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019

Azure Pipelines を使用して、正常にビルドされるたびに Web アプリを Azure App Service に自動的にデプロイします。 Azure Pipelines を使用すると、 Azure DevOps を使用して継続的インテグレーション (CI) と継続的デリバリー (CD) でビルド、テスト、およびデプロイを行うことができます。

YAML パイプラインは、リポジトリ内の YAML ファイルを使用して定義されます。 ステップは、パイプラインの最小の構成要素であり、スクリプトまたはタスク (事前にパッケージ化されたスクリプト) です。 パイプラインを構成する主要な概念とコンポーネントについて説明します

Azure Web アプリ タスク (AzureWebApp) を使って、パイプライン内の Azure App Service にデプロイします。 デプロイで XML パラメーターを使う必要があるなどのより複雑なシナリオでは、Azure App Service デプロイ タスク (AzureRmWebAppDeployment) を使用できます。

前提条件

1.スタックのパイプラインを作成する

このセクションのコード例では、ASP.NET Web アプリをデプロイすることを前提としています。 この手順は、他のフレームワークに合わせて調整できます。

詳しくは、Azure Pipelines エコシステムのサポートに関する記事を参照してください。

  1. Azure DevOps 組織にサインインし、プロジェクトに移動します。

  2. [パイプライン] に移動し、[新しいパイプライン] を選択します。

  3. ダイアログが表示されたら、ソース コードの場所 (Azure Repos Git または GitHub のいずれか) を選びます。

    サインインするために GitHub にリダイレクトされる場合があります。 その場合は、GitHub の資格情報を入力します。

  4. リポジトリの一覧が表示されたら、目的のリポジトリを選択します。

  5. Azure Pipelines アプリをインストールするために、GitHub にリダイレクトされる場合があります。 その場合は、[承認してインストール] を選択します。

  6. [構成] タブが表示されたら、[ASP.NET Core] を選択します。

  7. 新しいパイプラインが表示されたら、YAML に目を通し、その動作を確認します。 準備ができたら、[保存および実行] を選択します。

2.デプロイ タスクを追加する

  1. YAML ファイルの末尾をクリックし、[アシスタントを表示する] を選びます。

  2. タスク アシスタントを使用して、Azure Web アプリ タスクを追加します。

    Screenshot of Azure web app task.

    または、Azure App Service デプロイ (AzureRmWebAppDeployment) タスクを追加することもできます。

  3. お使いの Azure サブスクリプションを選びます。 必ず接続を承認してください。 認可により、必要なサービス接続が作成されます。

  4. App Service アプリに基づいて、[アプリの種類][アプリ名][ランタイム スタック] を選びます。 完成した YAML は次のコードのようになります。

    variables:
      buildConfiguration: 'Release'
    
    steps:
    - script: dotnet build --configuration $(buildConfiguration)
      displayName: 'dotnet build $(buildConfiguration)'
    - task: DotNetCoreCLI@2
      inputs:
        command: 'publish'
        publishWebProjects: true
    - task: AzureWebApp@1
      inputs:
        azureSubscription: '<service-connection-name>'
        appType: 'webAppLinux'
        appName: '<app-name>'
        package: '$(System.DefaultWorkingDirectory)/**/*.zip'
    
    • azureSubscription: Azure サブスクリプションに対して認可されたサービス接続の名前。
    • appName: 既存のアプリの名前。
    • package: App Service のコンテンツが含まれているパッケージまたはフォルダーへのファイル パス。 ワイルドカードを利用できます。

例: .NET アプリをデプロイする

.zip Web パッケージを (たとえば、ASP.NET Web アプリから) Azure Web アプリにデプロイするには、次のスニペットを使ってビルドをアプリにデプロイします。

variables:
  buildConfiguration: 'Release'

steps:
- script: dotnet build --configuration $(buildConfiguration)
  displayName: 'dotnet build $(buildConfiguration)'
- task: DotNetCoreCLI@2
  inputs:
    command: 'publish'
    publishWebProjects: true
- task: AzureWebApp@1
  inputs:
    azureSubscription: '<service-connection-name>'
    appType: 'webAppLinux'
    appName: '<app-name>'
    package: '$(System.DefaultWorkingDirectory)/**/*.zip'
  • azureSubscription: ご自分の Azure サブスクリプション。
  • appType: ご自分の Web アプリの種類。
  • appName: 既存のアプリ サービスの名前。
  • package: パッケージへのファイル パスまたはアプリ サービスの内容が含まれるフォルダー。 ワイルドカードを利用できます。

例: 仮想アプリケーションにデプロイする

既定では、デプロイは Azure Web アプリのルート アプリケーションに対して行われます。 Azure App Service デプロイ (AzureRmWebAppDeployment) タスクの VirtualApplication プロパティを使うことで、特定の仮想アプリケーションにデプロイできます。

- task: AzureRmWebAppDeployment@4
  inputs:
    VirtualApplication: '<name of virtual application>'

例: スロットにデプロイする

次の例は、ステージング スロットにデプロイしてから運用スロットにスワップする方法を示しています。

- 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>'
    appType: webAppLinux
    WebAppName: '<app-name>'
    ResourceGroupName: '<name of resource group>'
    SourceSlot: staging
    SwapWithProduction: true
  • azureSubscription: ご自分の Azure サブスクリプション。
  • appType: (省略可能) webAppLinux を使用して Linux の Web アプリにデプロイします。
  • appName: 既存のアプリ サービスの名前。
  • deployToSlotOrASE: ブール値。 既存のデプロイ スロットまたは Azure App Service Environment にデプロイします。
  • resourceGroupName: リソース グループの名前。 deployToSlotOrASE が true の場合は必須です。
  • slotName: スロットの名前。これは既定で production になります。 deployToSlotOrASE が true の場合は必須です。
  • 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'

例: 変数の置換を行う

ほとんどの言語スタックでは、実行時にアプリ設定接続文字列を環境変数として設定できます。

ただし、Web.config に対して変数の置換を行う理由は他にもあります。この例では、Web.config ファイルに connectionString という接続文字列が含まれています。 各 Web アプリにデプロイする前にこの値を変更できます。 これを行うには、Web.config 変換を適用するか、Web.config ファイル内の変数を置き換えます。

次のスニペットは、Azure App Service デプロイ (AzureRmWebAppDeployment) タスクを使った変数の置換例を示しています。

jobs:
- job: test
  variables:
    connectionString: <test-stage connection string>
  steps:
  - task: AzureRmWebAppDeployment@4
    inputs:
      azureSubscription: '<Test stage Azure service connection>'
      WebAppName: '<name of test stage web app>'
      enableXmlVariableSubstitution: true

- job: prod
  dependsOn: test
  variables:
    connectionString: <prod-stage connection string>
  steps:
  - task: AzureRmWebAppDeployment@4
    inputs:
      azureSubscription: '<Prod stage Azure service connection>'
      WebAppName: '<name of prod stage web app>'
      enableXmlVariableSubstitution: true

例: 条件付きでデプロイする

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 デプロイ (AzureRmWebAppDeployment) タスクは、Web 配置を使って App Service にデプロイできます。

trigger:
- main

pool:
  vmImage: windows-latest

variables:
  buildConfiguration: 'Release'

steps:
- script: dotnet build --configuration $(buildConfiguration)
  displayName: 'dotnet build $(buildConfiguration)'
- task: DotNetCoreCLI@2
  inputs:
    command: 'publish'
    publishWebProjects: true
    arguments: '--configuration $(buildConfiguration)'
    zipAfterPublish: true
- task: AzureRmWebAppDeployment@4
  inputs:
    ConnectionType: 'AzureRM'
    azureSubscription: '<service-connection-name>'
    appType: 'webApp'
    WebAppName: '<app-name>'
    packageForLinux: '$(System.DefaultWorkingDirectory)/**/*.zip'
    enableCustomDeployment: true
    DeploymentType: 'webDeploy'

よく寄せられる質問

タスク AzureWebAppAzureRmWebAppDeployment の違いは何ですか?

Azure Web アプリにデプロイするには、Azure Web アプリ タスク (AzureWebApp) が最も簡単な方法です。 既定では、デプロイは Azure Web アプリのルート アプリケーションに対して行われます。

Azure App Service デプロイ タスク (AzureRmWebAppDeployment) は、次のようにその他のカスタム シナリオに対応できます。

Note

また、Azure Pipelines で使用する個別のファイル変換タスクでは、ファイル変換と変数の置換もサポートされています。 ファイル変換タスクを使用することで、任意の構成とパラメーターの各ファイルにファイル変換と変数の置換を適用できます。

"無効な App Service パッケージまたはフォルダー パスが指定されました。" というメッセージを受け取る

YAML パイプラインでは、パイプラインによっては、構築された Web パッケージが保存されている場所とデプロイ タスクが検索する場所が一致しないことがあります。 たとえば、AzureWebApp タスクはデプロイ用の Web パッケージを取得します。 たとえば、AzureWebApp タスクは $(System.DefaultWorkingDirectory)/**/*.zip を検索します。 Web パッケージが他の場所に保管されている場合は、package の値を変更します。

"Web 配置オプションによる発行は、Windows エージェントを使用している場合のみサポートされます。" というメッセージを受け取る

このエラーは、AzureRmWebAppDeployment タスクで、Web 配置を使ってデプロイするようにタスクを構成しているにもかかわらず、エージェントが Windows を実行していない場合に発生します。 YAML に次のコードのような内容があることを確認します。

pool:
  vmImage: windows-latest

基本認証を無効にすると Web 配置が機能しない

AzureRmWebAppDeployment タスクで Microsoft Entra ID 認証を機能させるためのトラブルシューティング情報については、「Windows エージェントからの Microsoft Entra ID 認証を使用して Azure App Service に Web 配置できない」を参照してください

次のステップ