この記事では、Azure Pipelines でパイプラインを設定して、Web アプリをビルドして Azure にデプロイし、Azure App Service の組み込み認証を有効にする方法について説明します。
次の方法について学習します。
- Azure Pipelines でスクリプトを使用して Azure リソースを構成する
- Azure Pipelines を使用して Web アプリケーションをビルドし、App Service にデプロイする
- Azure Pipelines でMicrosoft Entra アプリの登録を作成する
- Azure Pipelines で App Service の組み込み認証を構成する。
[前提条件]
- アクティブなサブスクリプションを持つ Azure アカウント。 無料でアカウントを作成できます。
- Azure DevOps 組織。
無料で作成できます。
- Microsoft でホストされるエージェントを使用するには、Azure DevOps 組織が Microsoft でホストされている並列ジョブにアクセスできる必要があります。 並列ジョブを確認し、無料付与を要求する。
- Microsoft Entra テナント。
- GitHub アカウントと Git のローカル セットアップ。
- .NET 6.0 SDK の最小要件。
サンプル ASP.NET Core Web アプリを作成する
サンプル アプリを作成し、GitHub リポジトリにプッシュします。
GitHub でリポジトリを作成してクローンする
GitHub で新しいリポジトリを作成し、"PipelinesTest" のような名前を指定します。 これをプライベートに設定し、 を含む .gitignore template: VisualStudio
ファイルを追加します。
ターミナル ウィンドウを開き、現在の作業ディレクトリをクローンしたディレクトリの場所に変更します。
cd c:\temp\
次のコマンドを入力して、リポジトリをクローンします。
git clone https://github.com/YOUR-USERNAME/PipelinesTest
cd PipelinesTest
ASP.NET Core Web アプリを作成する
自分のマシンでターミナル ウィンドウを開き、作業ディレクトリに移動します。 dotnet new webapp コマンドを使用して新しい ASP.NET Core Web アプリを作成し、ディレクトリを新しく作成したアプリに変更します。
dotnet new webapp -n PipelinesTest --framework net7.0 cd PipelinesTest dotnet new sln dotnet sln add .
同じターミナル セッションから dotnet run コマンドを使用して、アプリケーションをローカルで実行します。
dotnet run --urls=https://localhost:5001/
Web アプリが実行されていることを確認するには、Web ブラウザーを開き、
https://localhost:5001
にあるアプリに移動します。
コア Web アプリ ASP.NET テンプレートがページに表示されます。
コマンド ラインで Ctrl + C キーを押して、Web アプリの実行を停止します。
サンプルを GitHub にプッシュする
変更をコミットし、GitHub にプッシュします。
git add .
git commit -m "Initial check-in"
git push origin main
Azure DevOps 環境を設定する
Azure DevOps 組織にサインインします (https://dev.azure.com/{yourorganization}
)。
新しいプロジェクトを作成します。
- [新しいプロジェクト] を選択します。
- [プロジェクト名] を入力します ("PipelinesTest" など)。
- 可視性に [プライベート] を選択します。
- を選択してを作成します。
新しいパイプラインを作成する
プロジェクトが作成されたら、パイプラインを追加します。
- 左側のナビゲーション ウィンドウで、[パイプライン] ->[パイプライン] を選択し、[パイプラインの作成] を選択します。
- [GitHub YAML] を選択します。
- [接続] タブで [GitHub YAML] を選択します。 確認を求められたら GitHub の資格情報を入力します。
- リポジトリの一覧が表示されたら、
PipelinesTest
リポジトリを選択します。 - Azure Pipelines アプリをインストールするために、GitHub にリダイレクトされる場合があります。 その場合は、[承認してインストール] を選択します。
- [パイプラインを構成する] で、[スタート パイプライン] を選択します。
- 基本構成を持つ新しいパイプラインが表示されます。 既定の構成では、Microsoft ホステッド エージェントを使用します。
- 準備ができたら、[ 保存して実行] を選択します。 GitHub に変更内容をコミットしてパイプラインを開始するには、[メイン ブランチに直接コミットする] を選択し、もう一度 [保存および実行] を選択します。 "この実行を続行する前に、リソースにアクセスするためのアクセス許可がこのパイプラインに必要です" のようなメッセージでアクセス許可を付与するよう求められた場合は、[表示] を選択し、プロンプトに従ってアクセスを許可します。
ビルド ステージとビルド タスクをパイプラインに追加する
機能するパイプラインが作成されたので、Web アプリをビルドするためにビルド ステージとビルド タスクを追加できます。
azure-pipelines.yml を更新し、基本のパイプライン構成を次のように置き換えます。
trigger:
- main
stages:
- stage: Build
jobs:
- job: Build
pool:
vmImage: 'windows-latest'
variables:
solution: '**/*.sln'
buildPlatform: 'Any CPU'
buildConfiguration: 'Release'
steps:
- task: NuGetToolInstaller@1
- task: NuGetCommand@2
inputs:
restoreSolution: '$(solution)'
- task: VSBuild@1
inputs:
solution: '$(solution)'
msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="$(build.artifactStagingDirectory)\WebApp.zip" /p:DeployIisAppPath="Default Web Site"'
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
変更を保存し、パイプラインを実行します。
ステージ Build
は、Web アプリをビルドするために定義されます。
steps
セクションの下には、Web アプリをビルドし、ビルド成果物をパイプラインに発行するためのさまざまなタスクが表示されます。
- NuGetToolInstaller@1 は、NuGet を取得して PATH に追加します。
- NuGetCommand@2 は、ソリューション内の NuGet パッケージを復元します。
- VSBuild@1 は、MSBuild を使用してソリューションをビルドし、アプリのビルド結果 (依存関係を含む) を .zip ファイルとしてフォルダーにパッケージ化します。
- PublishBuildArtifacts@1 は、.zip ファイルを Azure Pipelines に発行します。
サービス接続を作成する
サービス接続を追加して、パイプラインがリソースを Azure に接続してデプロイできるようにします。
- [Project settings] を選択します。
- 左側のナビゲーション ウィンドウで、[サービス接続] を選択し、[サービス接続の作成] を選択します。
- [Azure Resource Manager]、[次へ] の順に選択します。
- [サービス プリンシパル (自動)]、[次へ] の順に選択します。
- スコープ レベルとして [サブスクリプション] を選択し、ご使用の Azure サブスクリプションを選択します。 "PipelinesTestServiceConnection" などのサービス接続名を入力し、[次へ] を選択します。 サービス接続名は、次の手順で使用されます。
アプリケーションは、パイプラインの ID を提供する Microsoft Entra テナントにも作成されます。 後の手順でアプリの登録の表示名が必要になります。 表示名を確認するには:
- アプリケーション開発者以上として Microsoft Entra 管理センターにサインインします。
- Entra ID>アプリケーションの登録>すべてのアプリケーションに移動します。
- アプリの登録の表示名 (形式が
{organization}-{project}-{guid}
) を見つけます。
パイプラインにアクセスするためのアクセス許可をサービス接続に付与します。
- 左側のナビゲーション ウィンドウで、[プロジェクト設定]、[サービス接続] の順に選択します。
- [PipelinesTestServiceConnection] サービス接続、省略記号、ドロップダウン メニューから [セキュリティ] の順に選択します。
- [パイプラインのアクセス許可] セクションで、[パイプラインを追加します] を選択し、一覧から [PipelinesTest] サービス接続を選択します。
変数グループを追加する
次の セクションで作成する DeployAzureResources
ステージでは、いくつかの値を使用してリソースを作成し、Azure にデプロイします。
- Microsoft Entraテナント ID (Microsoft Entra 管理センターで確認)。
- リソースがデプロイされるリージョンまたは場所。
- リソース グループ名。
- App Service サービス プラン名。
- Web アプリの名前。
- パイプラインを Azure に接続するために使用されるサービス接続の名前。 パイプラインでは、この値は Azure サブスクリプションに使用されます。
変数グループを作成し、パイプラインで変数として使用する値を追加します。
左側のナビゲーション ウィンドウで [ライブラリ] を選択し、新しい変数グループを作成します。 "AzureResourcesVariableGroup" という名前を付けます。
次の変数と値を追加します。
変数名 | 値の例 |
---|---|
場所 | セントララス |
TENANTID | {tenant-id} |
RESOURCEGROUPNAME | パイプラインテストグループ |
SVCPLANNAME | パイプラインテスト計画 |
WEBAPPNAMETEST | パイプラインテストウェブアプリ |
AZURESUBSCRIPTION | パイプラインテストサービス接続 |
保存 を選択します。
変数グループにアクセスするためのアクセス許可をパイプラインに付与します。 変数グループのページで、[パイプラインのアクセス許可] を選択し、パイプラインを追加して、ウィンドウを閉じます。
azure-pipelines.yml を更新し、変数グループをパイプラインに追加します。
variables:
- group: AzureResourcesVariableGroup
trigger:
- main
stages:
- stage: Build
jobs:
- job: Build
pool:
vmImage: 'windows-latest'
変更を保存し、パイプラインを実行します。
Azure リソースを展開する
次に、Azure リソースをデプロイするパイプラインにステージを追加します。 パイプラインはインライン スクリプトを使用して、App Service インスタンスを作成します。 後の手順では、インライン スクリプトで、App Service 認証用の Microsoft Entra アプリの登録を作成します。 Azure Resource Manager (および Azure パイプライン タスク) ではアプリの登録を作成できないため、Azure CLI bash スクリプトが使用されます。
インライン スクリプトはパイプラインのコンテキストで実行され、スクリプトがアプリの登録を作成できるように Application.Administrator ロールをアプリに割り当てます。
- Microsoft Entra 管理センターにサインインします。
- Entra ID>役割と管理者に移動します。
- 組み込みロールの一覧から [Application Administrator](アプリケーション管理者)、[割り当ての追加] の順に選択します。
- 表示名でパイプライン アプリの登録を検索します。
- 一覧からアプリの登録を選択し、[追加] を選択します。
azure-pipelines.yml を更新してインライン スクリプトを追加します。これにより、Azure にリソース グループが作成され、App Service プランが作成され、App Service インスタンスが作成されます。
variables:
- group: AzureResourcesVariableGroup
trigger:
- main
stages:
- stage: Build
jobs:
- job: Build
pool:
vmImage: 'windows-latest'
variables:
solution: '**/*.sln'
buildPlatform: 'Any CPU'
buildConfiguration: 'Release'
steps:
- task: NuGetToolInstaller@1
- task: NuGetCommand@2
inputs:
restoreSolution: '$(solution)'
- task: VSBuild@1
inputs:
solution: '$(solution)'
msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="$(build.artifactStagingDirectory)\WebApp.zip" /p:DeployIisAppPath="Default Web Site"'
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
- stage: DeployAzureResources
displayName: 'Deploy resources to Azure'
dependsOn: Build
condition: |
succeeded()
jobs:
- job: DeployAzureResources
pool:
vmImage: 'windows-latest'
steps:
- task: AzureCLI@2
inputs:
azureSubscription: $(AZURESUBSCRIPTION)
scriptType: 'bash'
scriptLocation: 'inlineScript'
inlineScript: |
# Create a resource group
az group create --location $LOCATION --name $RESOURCEGROUPNAME
echo "Created resource group $RESOURCEGROUPNAME"
# Create App Service plan
az appservice plan create -g $RESOURCEGROUPNAME -n $SVCPLANNAME --sku FREE
echo "Created App Service plan $SVCPLANNAME"
### Create Test resources
# create and configure an Azure App Service web app
az webapp create -g $RESOURCEGROUPNAME -p $SVCPLANNAME -n $WEBAPPNAMETEST -r "dotnet:7"
name: DeploymentScript
変更を保存し、パイプラインを実行します。 Azure portal で、[リソース グループ] に移動し、新しいリソース グループと App Service インスタンスが作成されていることを確認します。
Web アプリを App Service にデプロイする
パイプラインが Azure でリソースを作成するようになったので、次は Web アプリを App Service にデプロイするためのデプロイ ステージです。
azure-pipelines.yml を更新して、デプロイ ステージを追加します。
variables:
- group: AzureResourcesVariableGroup
trigger:
- main
stages:
- stage: Build
jobs:
- job: Build
pool:
vmImage: 'windows-latest'
variables:
solution: '**/*.sln'
buildPlatform: 'Any CPU'
buildConfiguration: 'Release'
steps:
- task: NuGetToolInstaller@1
- task: NuGetCommand@2
inputs:
restoreSolution: '$(solution)'
- task: VSBuild@1
inputs:
solution: '$(solution)'
msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="$(build.artifactStagingDirectory)\WebApp.zip" /p:DeployIisAppPath="Default Web Site"'
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
- stage: DeployAzureResources
displayName: 'Deploy resources to Azure'
dependsOn: Build
condition: |
succeeded()
jobs:
- job: DeployAzureResources
pool:
vmImage: 'windows-latest'
steps:
- task: AzureCLI@2
inputs:
azureSubscription: $(AZURESUBSCRIPTION)
scriptType: 'bash'
scriptLocation: 'inlineScript'
inlineScript: |
# Create a resource group
az group create --location $LOCATION --name $RESOURCEGROUPNAME
echo "Created resource group $RESOURCEGROUPNAME"
# Create App Service plan
az appservice plan create -g $RESOURCEGROUPNAME -n $SVCPLANNAME --sku FREE
echo "Created App Service plan $SVCPLANNAME"
### Create Test resources
# create and configure an Azure App Service web app
az webapp create -g $RESOURCEGROUPNAME -p $SVCPLANNAME -n $WEBAPPNAMETEST -r "dotnet:7"
name: DeploymentScript
- stage: DeployWebApp
displayName: 'Deploy the web app'
dependsOn: DeployAzureResources
condition: |
succeeded()
jobs:
- job: DeployWebApp
displayName: 'Deploy Web App'
pool:
vmImage: 'windows-latest'
steps:
- task: DownloadBuildArtifacts@0
inputs:
buildType: 'current'
downloadType: 'single'
artifactName: 'drop'
downloadPath: '$(System.DefaultWorkingDirectory)'
- task: AzureRmWebAppDeployment@4
inputs:
ConnectionType: 'AzureRM'
azureSubscription: $(AZURESUBSCRIPTION)
appType: 'webApp'
WebAppName: '$(WEBAPPNAMETEST)'
packageForLinux: '$(System.DefaultWorkingDirectory)/**/*.zip'
変更を保存し、パイプラインを実行します。
DeployWebApp
ステージは、いくつかのタスクで定義されます。
- DownloadBuildArtifacts@1 は、前のステージでパイプラインに発行されたビルド成果物をダウンロードします。
- AzureRmWebAppDeployment@4 は、Web アプリを App Service にデプロイします。
App Service にデプロイされた Web サイトを表示する App Service に移動し、インスタンスの既定のドメイン (https://pipelinetestwebapp.azurewebsites.net
) を選択します。
pipelinetestwebapp が App Service に正常にデプロイされました。
App Service 認証を構成する
パイプラインが Web アプリを App Service にデプロイするようになったので、App Service 組み込み認証を構成できます。
DeployAzureResources
内のインライン スクリプトを次のように変更します。
- Web アプリの ID として Microsoft Entra アプリの登録を作成します。 アプリの登録を作成するには、パイプラインを実行するサービス プリンシパルにディレクトリ内のアプリケーション管理者ロールが必要です。
- アプリからシークレットを取得します。
- App Service Web アプリのシークレット設定を構成します。
- App Service Web アプリのリダイレクト URI、ホーム ページ URI、発行者の設定を構成します。
- Web アプリで他の設定を構成します。
variables:
- group: AzureResourcesVariableGroup
trigger:
- main
stages:
- stage: Build
jobs:
- job: Build
pool:
vmImage: 'windows-latest'
variables:
solution: '**/*.sln'
buildPlatform: 'Any CPU'
buildConfiguration: 'Release'
steps:
- task: NuGetToolInstaller@1
- task: NuGetCommand@2
inputs:
restoreSolution: '$(solution)'
- task: VSBuild@1
inputs:
solution: '$(solution)'
msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="$(build.artifactStagingDirectory)\WebApp.zip" /p:DeployIisAppPath="Default Web Site"'
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
- stage: DeployAzureResources
displayName: 'Deploy resources to Azure'
dependsOn: Build
condition: |
succeeded()
jobs:
- job: DeployAzureResources
pool:
vmImage: 'windows-latest'
steps:
- task: AzureCLI@2
inputs:
azureSubscription: $(AZURESUBSCRIPTION)
scriptType: 'bash'
scriptLocation: 'inlineScript'
inlineScript: |
# Create a resource group
az group create --location $LOCATION --name $RESOURCEGROUPNAME
echo "Created resource group $RESOURCEGROUPNAME"
# Create App Service plan
az appservice plan create -g $RESOURCEGROUPNAME -n $SVCPLANNAME --sku FREE
echo "Created App Service plan $SVCPLANNAME"
### Create Test resources
# create and configure an Azure App Service web app
az webapp create -g $RESOURCEGROUPNAME -p $SVCPLANNAME -n $WEBAPPNAMETEST -r "dotnet:7"
redirectUriTest="https://$WEBAPPNAMETEST.azurewebsites.net/.auth/login/aad/callback"
homePageUrlTest="https://$WEBAPPNAMETEST.azurewebsites.net"
issuerTest="https://sts.windows.net/$TENANTID"
# Required resource access. Access Microsoft Graph with delegated User.Read permissions.
cat > manifest.json << EOF
[
{
"resourceAppId": "00000003-0000-0000-c000-000000000000",
"resourceAccess": [
{
"id": "e1fe6dd8-ba31-4d61-89e7-88639da4683d",
"type": "Scope"
}
]
}
]
EOF
# Create app registration for App Service authentication
appIdTest=$(az ad app create --display-name $WEBAPPNAMETEST --sign-in-audience AzureADMyOrg --enable-id-token-issuance true --query appId --output tsv)
echo "Created app registration $appIdTest"
# Set identifier URI, homepage, redirect URI, and resource access
az ad app update --id $appIdTest --identifier-uris api://$appIdTest --web-redirect-uris $redirectUriTest --web-home-page-url $homePageUrlTest --required-resource-accesses @manifest.json
echo "Updated app $appIdTest"
# Get secret from the app for App Service authentication
secretTest=$(az ad app credential reset --id $appIdTest --query password --output tsv)
echo "Added secret to app $appIdTest"
az config set extension.use_dynamic_install=yes_without_prompt
az extension add --name authV2
az webapp config appsettings set --name $WEBAPPNAMETEST --resource-group $RESOURCEGROUPNAME --slot-settings MICROSOFT_PROVIDER_AUTHENTICATION_SECRET=$secretTest
echo "Updated settings for web app $WEBAPPNAMETEST"
az webapp auth microsoft update --name $WEBAPPNAMETEST --resource-group $RESOURCEGROUPNAME --client-id $appIdTest --secret-setting MICROSOFT_PROVIDER_AUTHENTICATION_SECRET --allowed-audiences $redirectUriTest --issuer $issuerTest
echo "Updated authentication settings for $WEBAPPNAMETEST"
name: DeploymentScript
- stage: DeployWebApp
displayName: 'Deploy the web app'
dependsOn: DeployAzureResources
condition: |
succeeded()
jobs:
- job: DeployWebApp
displayName: 'Depoy Web App'
pool:
vmImage: 'windows-latest'
steps:
- task: DownloadBuildArtifacts@0
inputs:
buildType: 'current'
downloadType: 'single'
artifactName: 'drop'
downloadPath: '$(System.DefaultWorkingDirectory)'
- task: AzureRmWebAppDeployment@4
inputs:
ConnectionType: 'AzureRM'
azureSubscription: $(AZURESUBSCRIPTION)
appType: 'webApp'
WebAppName: '$(WEBAPPNAMETEST)'
packageForLinux: '$(System.DefaultWorkingDirectory)/**/*.zip'
変更を保存し、パイプラインを実行します。
Web アプリへの制限付きアクセスを確認する
アプリへのアクセスが組織内のユーザーに制限されていることを確認するには、自身の App Service に移動し、インスタンスの既定のドメインを選択します: https://pipelinetestwebapp.azurewebsites.net
。
セキュリティで保護されたサインイン ページが表示されるので、認証されていないユーザーにはサイトへのアクセスが許可されないことを確認できます。 サイトにアクセスするために、組織内のユーザーとしてサインインします。
新しいブラウザーを起動し、個人用アカウントを使用してサインインしてみることで、組織外のユーザーにはアクセス権がないことを確認することもできます。
リソースをクリーンアップする
Azure リソースと Azure DevOps 環境をクリーンアップして、完了後にリソースに対して課金されないようにします。
リソース グループを削除します
メニューから [リソース グループ] を選択し、デプロイされた Web アプリが含まれるリソース グループを選択します。
[リソース グループの削除] を選択して、リソース グループとすべてのリソースを削除します。
パイプラインを無効にする、または Azure DevOps プロジェクトを削除する
GitHub リポジトリを参照するプロジェクトを作成しました。 GitHub リポジトリに変更をプッシュするたびにパイプラインが実行され、無料のビルド時間 (分) またはリソースが消費されます。
オプション 1: パイプラインを無効にする
プロジェクトとビルド パイプラインを今後の参照用に保持したい場合は、このオプションを選択します。 必要な場合は、パイプラインを後でもう一度有効にできます。
- Azure DevOps プロジェクトで、[パイプライン] を選択したら、パイプラインを選択します。
- 右端にある省略記号ボタンを選択し、[設定] を選択します。
- [無効] を選択してから、[保存] を選択します。 パイプラインによる新しい実行要求は処理されなくなります。
オプション 2: プロジェクトを削除する
今後の参照用に DevOps プロジェクトが必要でない場合は、このオプションを選択します。 これにより、Azure DevOps プロジェクトが削除されます。
- Azure DevOps プロジェクトに移動します。
- 左下隅にある [プロジェクトの設定 ] を選択します。
- [概要] で、ページの下部まで下にスクロールしたら、[削除] を選択します。
- テキスト ボックスにプロジェクト名を入力したら、[削除] を選択します。
Microsoft Entra ID でアプリの登録を削除する
Microsoft Entra 管理センターで、[Entra ID>App registrations>All applications] を選択します。
パイプラインのアプリケーション (表示名の形式が {organization}-{project}-{guid}
) を選択し、削除します。
Web アプリのアプリケーション (pipelinetestwebapp) を選択し、削除します。
次のステップ
詳細については、以下をご覧ください。