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
を使用できます。
前提条件:
- アクティブなサブスクリプションが含まれる Azure アカウント。 無料でアカウントを作成できます。
- Azure DevOps 組織。 無料で作成できます。
- Microsoft がホストするエージェントでパイプラインを実行する機能。 並列ジョブを購入することも、Free レベルを要求することもできます。
-
GitHub または Azure Repos でホストされているコードを含む、動作する Azure App Service アプリ。
- .NET: 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 アプリを作成します。
1.スタックのパイプラインを作成する
このセクションのコード例では、ASP.NET Web アプリをデプロイすることを前提としています。 この手順は、他のフレームワークに合わせて調整できます。
詳しくは、Azure Pipelines エコシステムのサポートに関する記事を参照してください。
Azure DevOps 組織にサインインし、プロジェクトに移動します。
[パイプライン] に移動し、[新しいパイプライン] を選択します。
ダイアログが表示されたら、ソース コードの場所 (Azure Repos Git または GitHub のいずれか) を選びます。
サインインするために GitHub にリダイレクトされる場合があります。 その場合は、GitHub の資格情報を入力します。
リポジトリの一覧が表示されたら、目的のリポジトリを選択します。
Azure Pipelines アプリをインストールするために、GitHub にリダイレクトされる場合があります。 その場合は、[承認してインストール] を選択します。
[構成] タブが表示されたら、[ASP.NET Core] を選択します。
新しいパイプラインが表示されたら、YAML に目を通し、その動作を確認します。 準備ができたら、[保存および実行] を選択します。
2.デプロイ タスクを追加する
YAML ファイルの末尾を選択し、[ アシスタントの表示] を選択します。
タスク アシスタントを使用して、Azure Web アプリ タスクを追加します。
または、 Azure App Service のデプロイ
AzureRmWebAppDeployment
タスクを追加することもできます。お使いの Azure サブスクリプションを選びます。 必ず [ 承認 ] を選択して接続を承認してください。 認可により、必要なサービス接続が作成されます。
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 デプロイ タスク VirtualApplication
の AzureRmWebAppDeployment
プロパティを使用して、特定の仮想アプリケーションにデプロイできます。
- task: AzureRmWebAppDeployment@4
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>'
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
: パッケージまたは 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'
よく寄せられる質問
タスク AzureWebApp
と AzureRmWebAppDeployment
の違いは何ですか?
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 デプロイできない」を参照してください。
関連コンテンツ
- Azure DevOps パイプラインをカスタマイズします。