次の方法で共有


Azure Pipelines を使用して Azure 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 App タスク (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 アプリ タスクを追加します。

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

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

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

    variables:
      buildConfiguration: 'Release'
    
    steps:
    - 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:
- 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: パッケージまたは App Service コンテンツを含むフォルダーへのファイル パス。 ワイルドカードを利用できます。

例: 仮想アプリケーションへのデプロイ

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

- 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: スロットの名前。既定では productiondeployToSlotOrASE が true の場合は必須です。
  • package: パッケージまたは App Service コンテンツを含むフォルダーへのファイル パス。 ワイルドカードを利用できます。
  • 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 Deploy でデプロイする

Azure App Service デプロイ タスク AzureRmWebAppDeployment 、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@4
  inputs:
    ConnectionType: 'AzureRM'
    azureSubscription: '<service-connection-name>'
    appType: 'webApp'
    WebAppName: '<app-name>'
    packageForLinux: '$(System.DefaultWorkingDirectory)/**/*.zip'
    enableCustomDeployment: true
    DeploymentType: 'webDeploy'

よく寄せられる質問

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

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

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

  • 通常、インターネット インフォメーション サービス (IIS) の展開プロセスを使用する場合は、Web 配置を使用して展開します。
  • 仮想アプリケーションにデプロイする
  • コンテナー アプリ、関数アプリ、Web ジョブ、API アプリ、モバイル アプリなど、他の種類のアプリにデプロイします。

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

"無効な App Service パッケージまたはフォルダー パスが指定されました" というメッセージが表示されるのはなぜですか?

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

"Webdeploy オプションを使用した発行は、Windows エージェントを使用している場合にのみサポートされます" というメッセージが表示されるのはなぜですか?

このエラーは、AzureRmWebAppDeploymentを使用してデプロイするようにタスクを構成したが、エージェントが Windows を実行していない場合に、 タスクで発生します。 YAML に次のようなコードが含まれていることを確認します。

pool:
  vmImage: windows-latest

基本認証を無効にすると Web 配置が機能しないのはなぜですか?

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