Azure Pipelines を使用して App Service にデプロイする
Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019
Note
2024 年 6 月 1 日より、新しく作成されたすべての App Service アプリには、名前付け規則 <app-name>-<random-hash>.<region>.azurewebsites.net
を使用して一意の既定のホスト名を生成するオプションがあります。 既存のアプリ名は変更されません。
例: myapp-ds27dh7271aah175.westus-01.azurewebsites.net
詳しくは、App Service リソースの一意の既定のホスト名に関する記事をご覧ください。
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) を使用できます。
前提条件
- アクティブなサブスクリプションが含まれる Azure アカウント。 無料でアカウントを作成できます。
- Azure DevOps 組織。 無料で作成できます。
- Microsoft によってホストされるエージェントでパイプラインを実行する機能。 並列ジョブを購入するか、Free レベルを要求できます。
- GitHub または Azure Repos にホストされたコードを含む Azure App Service アプリが動作している。
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: パッケージへのファイル パスまたはアプリ サービスの内容が含まれるフォルダー。 ワイルドカードを利用できます。
例: 仮想アプリケーションにデプロイする
既定では、デプロイは Azure Web アプリのルート アプリケーションに対して行われます。 Azure App Service デプロイ (AzureRmWebAppDeployment
) タスクの VirtualApplication
プロパティを使うことで、特定の仮想アプリケーションにデプロイできます。
- 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: パッケージへのファイル パスまたはアプリ サービスの内容が含まれるフォルダー。 ワイルドカードを利用できます。
- 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:
- 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 アプリにデプロイするには、Azure Web アプリ タスク (AzureWebApp
) が最も簡単な方法です。 既定では、デプロイは Azure Web アプリのルート アプリケーションに対して行われます。
Azure App Service デプロイ タスク (AzureRmWebAppDeployment
) は、次のようにその他のカスタム シナリオに対応できます。
- Web パッケージや XML パラメーター ファイル内の構成設定を変更する。
- IIS デプロイ プロセスに慣れている場合は、Web 配置を使ってデプロイする。
- 仮想アプリケーションにデプロイする。
- コンテナー アプリ、関数アプリ、WebJobs、API やモバイル アプリなど、他のアプリの種類にデプロイする。
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 配置できない」を参照してください
次のステップ
- Azure DevOps パイプラインをカスタマイズします。