Azure DevOps Services
このチュートリアルでは、Azure Pipelines を使用して継続的インテグレーションと継続的デリバリー (CI/CD) を行い、Python Web アプリをビルドして Azure App Service on Linux にデプロイする方法について説明します。 パイプラインは、アプリ コード リポジトリにコミットされるたびに、Python Web アプリを自動的にビルドして App Service にデプロイします。
このチュートリアルでは、次の操作を行います。
- Python Web アプリを作成し、Azure App Service にアップロードします。
- Azure DevOps プロジェクトを Azure に接続します。
- アプリの Azure Pipelines Python 固有のビルドおよびデプロイ パイプラインを作成します。
- パイプラインを実行して、Azure App Service Web アプリをビルド、テスト、デプロイします。
- リポジトリにコミットするたびにパイプラインを実行するトリガーを設定します。
Azure Pipelines の概念の詳細については、次のビデオをご覧ください。
前提条件
| 製品 | 要件 |
|---|---|
| Azure DevOps | - Azure DevOps プロジェクト。 - Microsoft がホストするエージェントでパイプラインを実行する機能。 並列ジョブを購入するか、Free レベルを要求できます。 - YAML と Azure Pipelines に関する基本的な知識。 詳細については、「最初のパイプラインの作成」を参照してください。 - アクセス許可: - パイプラインを作成するには、 共同作成者 グループに含まれている必要があり、グループには [ ビルド パイプラインの作成 ] アクセス許可が [許可] に設定されている必要があります。 プロジェクト管理者グループのメンバーは、パイプラインを管理できます。 - サービス接続を作成するには、サービス接続の管理者ロールまたは作成者ロールが必要です。 |
| GitHubの | - GitHub アカウント。 - Azure Pipelines を承認するための GitHub サービス接続 。 |
| 紺碧 | Azure サブスクリプション。 |
| 製品 | 要件 |
|---|---|
| Azure DevOps | - Azure DevOps プロジェクト。 - セルフホステッド エージェント。 作成するには、 セルフホステッド エージェントに関するページを参照してください。 - YAML と Azure Pipelines に関する基本的な知識。 詳細については、「最初のパイプラインの作成」を参照してください。 - アクセス許可: - パイプラインを作成するには、 共同作成者 グループに含まれている必要があり、グループには [ ビルド パイプラインの作成 ] アクセス許可が [許可] に設定されている必要があります。 プロジェクト管理者グループのメンバーは、パイプラインを管理できます。 - サービス接続を作成するには、サービス接続の管理者ロールまたは作成者ロールが必要です。 |
| GitHubの | - GitHub アカウント。 - Azure Pipelines を承認するための GitHub サービス接続 。 |
| 紺碧 | Azure サブスクリプション。 |
セルフホステッド エージェントを構成する
セルフホステッド ビルド エージェントでは、Python バージョンのダウンロードはサポートされていません。 独自のセルフホステッド エージェントを使用するには、Python を実行するようにエージェントを構成する必要があります。
互換性の問題を回避するには、Python のバージョンを Azure App Services Web アプリのランタイム バージョンと一致させます (この場合 3.11 )。 Python バージョンをプレインストールする必要があります。 完全なインストーラーを使用して、Python の pip 互換バージョンを取得します。
パイプライン タスクで使用できるように、目的の Python バージョンをセルフホステッド エージェントのツール キャッシュに追加する必要があります。 通常、ツール キャッシュはエージェントの _work/_tool ディレクトリにあります。 または、環境変数 AGENT_TOOLSDIRECTORYでパスをオーバーライドすることもできます。 tools ディレクトリの下に、Python のバージョンに基づいて次のディレクトリ構造を作成します。
$AGENT_TOOLSDIRECTORY/
Python/
{version number}/
{platform}/
{tool files}
{platform}.complete
バージョン番号は、1.2.3 の形式に従う必要があります。 プラットフォームは x86 または x64 です。 ツール ファイルは、解凍された Python バージョン ファイルである必要があります。
{platform}.complete は、 x86.complete や x64.complete のような 0 バイトのファイルで、ツールがキャッシュに正しくインストールされていることを示すだけです。
たとえば、64 ビット Windows マシンで Python 3.11 を使用するには、次のディレクトリ構造を作成します。
$AGENT_TOOLSDIRECTORY/
Python/
3.11.4/
x64/
{python files}
x64.complete
エージェントをホストしているマシンに、使用する Python バージョンが既にある場合は、ツール キャッシュにファイルをコピーできます。 Python バージョンがない場合は、 Python Web サイトからダウンロードできます。
サンプル アプリを準備する
https://github.com/Microsoft/python-sample-vscode-flask-tutorial にあるサンプル リポジトリを、GitHub アカウントにフォークします。
git clone <your-forked-repository-url>.gitを使用して、フォークをローカル コンピューターに複製します。cd python-sample-vscode-flask-tutorialを使用してローカルクローンに移動し、アプリをローカルでビルドして実行し、動作することを確認します。python -m venv .env source .env/Scripts/activate pip install --upgrade pip pip install -r ./requirements.txt export FLASK_APP=hello_app.webapp flask runアプリをテストするには、ブラウザー ウィンドウで http://localhost:5000 に移動し、 Visual Studio Flask チュートリアルというタイトルが表示されていることを確認します。
ブラウザー ウィンドウを閉じ、使用して Flask サーバーを停止+。
App Service Web アプリを作成してデプロイする
Azure portal で Cloud Shell を使用して Azure App Service Web アプリを作成します。 Cloud Shell を使用するには、 Azure portal にサインインし、ツール バーの Cloud Shell ボタンを選択します。
Cloud Shell がブラウザーの下部に表示されます。 ドロップダウン メニューで Bash が環境として選択されていることを確認します。 Cloud Shell ウィンドウを最大化して、より多くのスペースを与えることができます。
ヒント
Cloud Shell に貼り付けるには、 Ctrl+Shift+V キーを使用するか、右クリックしてコンテキスト メニューから [貼り付け ] を選択します。
Web アプリを作成してデプロイする
Cloud Shell で、次のコマンドを使用してフォークされたリポジトリを Azure に複製し、
<your-forked-repository-url>をフォークされたリポジトリの URL に置き換えます。git clone <your-forked-repository-url>複製されたリポジトリ フォルダーにディレクトリを変更します。
cd python-sample-vscode-flask-tutorialaz webapp up コマンドを実行して App Service Web アプリをプロビジョニングし、最初のデプロイを行います。
--name <your-web-app-name>パラメーターを使用して、Azure 全体で一意の名前 (個人名や会社名など) とアプリ識別子 (--name <your-name>-flaskpipelinesなど) を割り当てます。 パラメーターなしでaz webapp upを実行すると、Azure で一意のランダムに生成された Web アプリ名が割り当てられます。az webapp up --name <your-web-app-name>
az webapp up コマンドは、アプリを Python アプリとして認識し、次のアクションを実行します。
- 既定の リソース グループを作成します。
- 既定の App Service プランを作成します。
- 割り当てられた名前を持つ Web アプリを作成します。 アプリ
URLが<your-web-app-name>.azurewebsites.net。 - ビルド自動化を有効にして、現在の作業ディレクトリから ZIP アーカイブにすべてのファイルをデプロイします。
- パラメーターを .azure/config ファイルにローカルにキャッシュするため、
az webapp upやその他のaz webappコマンドを使用してプロジェクト フォルダーからデプロイするときに、パラメーターを再度指定する必要はありません。 コマンドでは、既定でキャッシュされた値が自動的に使用されます。
コマンド パラメーターを使用して、既定のアクションを独自の値でオーバーライドできます。 詳細については、「az webapp up」を参照してください。
az webapp up コマンドは、サンプル Web アプリに対して次の JSON 出力を生成します。
{
"URL": <your-web-app-url>,
"appserviceplan": <your-app-service-plan-name>,
"___location": <your-azure-region>,
"name": <your-web-app-name>,
"os": "Linux",
"resourcegroup": <your-resource-group>,
"runtime_version": "python|3.11",
"runtime_version_detected": "-",
"sku": <sku>,
"src_path": <repository-source-path>
}
このチュートリアルの後半で使用するために、 URL、 resourcegroup、および runtime_version の値を記録します。
スタートアップ コマンドを設定する
python-sample-vscode-flask-tutorial アプリには、Web アプリの特定のスタートアップ コマンドを含む startup.txt ファイルがあります。 リソース グループと Web アプリ名を使用して、次のコマンドを入力して、Web アプリ startup-file 構成プロパティを startup.txt に設定します。
az webapp config set --resource-group <your-resource-group> --name <your-web-app-name> --startup-file startup.txt
コマンドが完了すると、JSON 出力に Web アプリのすべての構成設定が表示されます。
実行中のアプリを表示するには、ブラウザーを開き、 URL コマンド出力に示されている az webapp up に移動します。 汎用ページが表示される場合は、App Service が起動するまで数秒待ってから、ページを更新します。
Visual Studio Flask チュートリアルというタイトルが表示されることを確認します。
Azure DevOps プロジェクトを Azure サブスクリプションに接続する
Azure Pipelines を使用して Azure App Service Web アプリにデプロイするには、Azure DevOps プロジェクトを Azure リソースに接続する必要があります。
サービス プリンシパルの作成
サービス プリンシパルは、アプリケーション、ホストされたサービス、および Azure リソースにアクセスするための自動化されたツール用に作成された ID です。 このアクセスは、サービス プリンシパルに割り当てられたロールに制限されるため、どのレベルでどのリソースにアクセスできるかを制御できます。
サービス プリンシパルを作成するには、Bash Cloud Shell で次のコマンドを実行します。
<service-principal-name>をサービス プリンシパルの名前に置き換え、<your-subscription-id>を Azure サブスクリプション ID に、<your-resource-group>を Web アプリのリソース グループに置き換えます。
az ad sp create-for-rbac --display-name <service-principal-name> --role contributor --scopes /subscriptions/<your-subscription-id>/resourceGroups/<your-resource-group>
このコマンドは、次の JSON オブジェクトを返します。
{
"appId": "<client GUID>",
"displayName": "<service-principal-name">,
"password": "<password-string>",
"tenant": "<tenant GUID>"
...
}
次のセクションで、サービス接続の作成に使用する appId、 password、および tenantId の値をメモしておきます。
サービス接続を作成する
サービス接続は、Azure Pipelines から外部およびリモート サービスへの認証済みアクセスを提供します。 Azure App Service Web アプリにデプロイするには、Web アプリのリソース グループへのサービス接続を作成します。
Azure DevOps プロジェクト ページで、[ プロジェクトの設定] を選択します。
[プロジェクトの設定] で、[パイプライン>サービス接続] を選択します。
[ サービス接続 ] ページで、このサービス接続がプロジェクトの最初の接続である場合は、[ 新しい サービス接続] または [サービス接続の 作成 ] を選択します。
[ 新しいサービス接続 ] 画面で、[ Azure Resource Manager ] を選択し、[ 次へ] を選択します。
[ 新しい Azure サービス接続 ] 画面で、 ID の種類を選択します。 この例では 、推奨されるアプリ登録 (自動) を使用します。 認証方法の詳細については、「Azure Resource Manager サービス接続を使用して Azure に接続する」を参照してください。
[ 資格情報] で、[ ワークロード ID フェデレーション (自動)] を選択します。
次のフィールドに入力します。
- スコープ レベル: [サブスクリプション] を選択します。
- サブスクリプション:Azure サブスクリプションを選択します。
- リソース グループ: Web アプリを含むリソース グループを選択します。
- サービス接続名: 接続のわかりやすい名前を入力します。
- すべてのパイプラインにアクセス許可を付与する: プロジェクト内のすべてのパイプラインへのアクセスを許可するには、このチェック ボックスをオンにします。
[保存] を選択します。
Azure DevOps プロジェクト ページで、[ プロジェクトの設定] を選択します。
[プロジェクトの設定] で、[パイプライン>サービス接続] を選択します。
[ サービス接続 ] ページで、このサービス接続がプロジェクトの最初の接続である場合は、[ 新しい サービス接続] または [サービス接続の 作成 ] を選択します。
[ 新しいサービス接続 ] 画面で、[ Azure Resource Manager ] を選択し、[ 次へ] を選択します。
[ サービス プリンシパル (手動)] を選択し、[ 次へ] を選択します。
[ 新しい Azure サービス接続 ] 画面で、次のフィールドに入力します。
- 環境: Azure Cloud を選択します。
- スコープ レベル: [サブスクリプション] を選択します。
- サブスクリプション ID: Azure サブスクリプション ID を入力します。
- サブスクリプション名: Azure サブスクリプション名を入力します。
[ 認証 ] セクションで、次のフィールドに入力します。
-
サービス プリンシパル ID:
appIdコマンドによって返されるaz ad sp create-for-rbac値を入力します。 - 資格情報: サービス プリンシパル キーを選択します。
-
サービス プリンシパル キー:
passwordコマンドによって返されるaz ad sp create-for-rbac値を入力します。 -
テナント ID:
tenantコマンドによって返されるaz ad sp create-for-rbac値を入力します。 - [確認] を選択して、接続を確認します。
-
サービス プリンシパル ID:
[ 詳細 ] セクションの [ サービス接続名] に、サービス接続の名前を入力します。
[ すべてのパイプラインにアクセス許可を付与する] チェック ボックスをオンにします。
[Verify and save] を選択します。
新しい接続が サービス接続 の一覧に表示され、パイプラインで使用する準備が整いました。
パイプラインを作成する
パイプラインを作成して Python Web アプリをビルドし、Azure App Service にデプロイします。
プロジェクトの左側のナビゲーション メニューで、[パイプライン] を選択 します。
[パイプライン] ページ で 、[ 新しいパイプライン] を選択するか、このパイプラインがプロジェクトの最初のパイプラインである場合は [パイプラインの 作成 ] を選択します。
[コードの場所] 画面で、GitHub を選択します。 GitHub へのサインインを求められる場合があります。
[ リポジトリの選択 ] 画面で、フォークしたサンプル リポジトリを選択します。 GitHub では、GitHub パスワードをもう一度入力するか、 Azure Pipelines GitHub アプリをインストールするように求められる場合があります。 画面の指示に従ってアプリをインストールします。 詳細については、「 GitHub アプリ認証」を参照してください。
[ パイプラインの構成 ] ページで、 Python から Linux Web App on Azure を選択します。
次の画面で、Azure サブスクリプションを選択し、[ 続行] を選択します。
次の画面で、Azure Web アプリを選択し、[ 検証と構成] を選択します。
Azure Pipelines によって azure-pipelines.yml ファイルが作成され、YAML パイプライン エディターに表示されます。
プロジェクトの左側のナビゲーション メニューで、[パイプライン] を選択 します。
[パイプライン] ページ で 、[ 新しいパイプライン] を選択するか、このパイプラインがプロジェクトの最初のパイプラインである場合は [パイプラインの 作成 ] を選択します。
[コードの場所] ページで、GitHub Enterprise Server を選択します。 GitHub へのサインインを求められる場合があります。
[ リポジトリの選択 ] タブで、フォークしたサンプル リポジトリを選択します。 GitHub では、GitHub パスワードをもう一度入力するか、 Azure Pipelines GitHub 拡張機能またはアプリをインストールするように求められる場合があります。 画面の指示に従ってアプリをインストールします。 詳細については、「Github リポジトリへのアクセス」を参照してください。
[ パイプラインの構成 ] ページで、[ スターター パイプライン] を選択します。
[ パイプライン YAML の確認 ] ページで、スターター azure-pipelines.yml ファイルの内容を次の YAML パイプライン ファイルに置き換えます。 YAML ファイルで次の手順を実行します。
<your-service-connection-name>と<your-web-app-name>のプレースホルダーを独自の値に置き換えます。<your-pool-name>を使用するエージェント プールの名前に置き換え、<your-python-version>をエージェントで実行されている Python のバージョンに置き換えます。 このバージョンは、runtime_versionコマンドの JSON 出力のaz webapp upと一致している必要があります。
YAML パイプライン ファイル
[ パイプライン YAML の確認 ] ページで、パイプラインを確認して、その動作を確認します。 すべての既定の入力が自分のコードに適していることを確認します。 パイプライン YAML ファイル スキーマの詳細については、 YAML スキーマリファレンスを参照してください。
次の完全な YAML パイプライン ファイルの例では、CI/CD パイプラインを一連の ステージ、 ジョブ、 およびステップとして定義します。各ステップには、さまざまな タスク とスクリプトの詳細が含 まれています。 生成された YAML コードにより、プレースホルダーにアプリと接続の値が自動的に設定されます。
trigger:
- main
variables:
# Azure Resource Manager connection created during pipeline creation
azureServiceConnectionId: '<GUID>'
# Web app name
webAppName: '<your-webapp-name>'
# Agent VM image name
vmImageName: 'ubuntu-latest'
# Environment name
environmentName: '<your-webapp-name>'
# Project root folder. Point to the folder containing manage.py file.
projectRoot: $(System.DefaultWorkingDirectory)
pythonVersion: '3.11'
stages:
- stage: Build
displayName: Build stage
jobs:
- job: BuildJob
pool:
vmImage: $(vmImageName)
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '$(pythonVersion)'
displayName: 'Use Python $(pythonVersion)'
- script: |
python -m venv antenv
source antenv/bin/activate
python -m pip install --upgrade pip
pip install setuptools
pip install -r requirements.txt
workingDirectory: $(projectRoot)
displayName: "Install requirements"
- task: ArchiveFiles@2
displayName: 'Archive files'
inputs:
rootFolderOrFile: '$(projectRoot)'
includeRootFolder: false
archiveType: zip
archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
replaceExistingArchive: true
- upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
displayName: 'Upload package'
artifact: drop
- stage: Deploy
displayName: 'Deploy Web App'
dependsOn: Build
condition: succeeded()
jobs:
- deployment: DeploymentJob
pool:
vmImage: $(vmImageName)
environment: $(environmentName)
strategy:
runOnce:
deploy:
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '$(pythonVersion)'
displayName: 'Use Python version'
- task: AzureWebApp@1
displayName: 'Deploy Azure Web App : $(webAppName)'
inputs:
azureSubscription: $(azureServiceConnectionId)
appName: $(webAppName)
package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
trigger:
- main
variables:
# Azure Resource Manager connection created during pipeline creation
azureServiceConnectionId: '<your-service-connection-name>'
# Web app name
webAppName: '<your-web-app-name>'
# Environment name
environmentName: '<your-web-app-name>'
# Project root folder.
projectRoot: $(System.DefaultWorkingDirectory)
# Python version:
pythonVersion: '<your-python-version>'
stages:
- stage: Build
displayName: Build stage
jobs:
- job: BuildJob
pool:
name: '<your-pool-name>'
demands: python
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '$(pythonVersion)'
displayName: 'Use Python $(pythonVersion)'
- script: |
python -m venv antenv
source antenv/bin/activate
python -m pip install --upgrade pip
pip install -r requirements.txt
workingDirectory: $(projectRoot)
displayName: "Install requirements"
- task: ArchiveFiles@2
displayName: 'Archive files'
inputs:
rootFolderOrFile: '$(projectRoot)'
includeRootFolder: false
archiveType: zip
archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
replaceExistingArchive: true
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
- stage: Deploy
displayName: 'Deploy Web App'
dependsOn: Build
condition: succeeded()
jobs:
- deployment: DeploymentJob
pool:
name: '<your-pool-name'
environment: $(environmentName)
strategy:
runOnce:
deploy:
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '$(pythonVersion)'
displayName: 'Use Python version'
- task: AzureWebApp@1
displayName: 'Deploy Azure Web App : <your-web-app-name>'
inputs:
azureSubscription: $(azureServiceConnectionId)
appName: $(webAppName)
package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
startUpCommand: 'startup.txt'
変数
YAML ファイルの先頭にある variables セクションでは、次の変数を定義します。
| 変数 | 説明 |
|---|---|
azureServiceConnectionId |
Azure Resource Manager サービス接続の ID。 |
webAppName |
App Service Web アプリの名前。 |
vmImageName |
ビルド エージェントに使用するオペレーティング システムの名前。 |
environmentName |
デプロイ先の環境の名前。デプロイ ジョブの実行時に自動的に作成されます。 |
projectRoot |
アプリ コードを含むルート フォルダー。 |
pythonVersion |
ビルドおよびデプロイ エージェントで使用する Python のバージョン。 |
| 変数 | 説明 |
|---|---|
azureServiceConnectionId |
Azure Resource Manager サービス接続の ID。 |
webAppName |
App Service Web アプリの名前。 |
environmentName |
デプロイ先の環境の名前。デプロイ ジョブの実行時に自動的に作成されます。 |
projectRoot |
アプリ コードを含むフォルダー。 値は自動システム変数です。 |
pythonVersion |
ビルドおよびデプロイ エージェントで使用する Python のバージョン。 |
ビルドとデプロイのステージ
パイプラインは、ビルドステージとデプロイステージで構成されます。
構築段階
ビルド ステージには、 vmImageName 変数で定義されているオペレーティング システムで実行される 1 つのジョブ (この場合は ubuntu-latest) が含まれます。
- job: BuildJob
pool:
vmImage: $(vmImageName)
ビルド ステージには、pool パラメーターによって識別されるname内のエージェントで実行される 1 つのジョブが含まれています。
エージェントの機能は、 demands キーワードで指定できます。 たとえば、 demands: python エージェントに Python がインストールされている必要があることを指定します。 名前でセルフホステッド エージェントを指定するには、 demands: Agent.Name -equals <agent-name>を使用できます。
- job: BuildJob
pool:
name: <your-pool-name>
demands: python
ジョブには複数のステップが含まれています。
まず、 UsePythonVersion タスクは、
pythonVersion変数で定義されているように、使用する Python のバージョンを選択します。- task: UsePythonVersion@0 inputs: versionSpec: '$(pythonVersion)' displayName: 'Use Python $(pythonVersion)'次の手順では、仮想 Python 環境を作成し、
requirements.txtからアプリの依存関係をインストールするスクリプトを使用します。workingDirectoryパラメーターは、アプリ コードの場所を指定します。- script: | python -m venv antenv source antenv/bin/activate python -m pip install --upgrade pip pip install setuptools pip install -r ./requirements.txt workingDirectory: $(projectRoot) displayName: "Install requirements"ArchiveFiles タスクは、ビルドされた Web アプリを含む ZIP アーカイブを作成します。
- task: ArchiveFiles@2 displayName: 'Archive files' inputs: rootFolderOrFile: '$(projectRoot)' includeRootFolder: false archiveType: zip archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip replaceExistingArchive: trueパラメーターは次のように設定されます。
パラメーター 説明 rootFolderOrFileアプリ コードの場所。 includeRootFolderルート フォルダーを .zip ファイルに含めるかどうか。 falseに設定します。trueに設定すると、.zip ファイルの内容は s という名前のフォルダーに格納され、タスクでアプリ コードが見つかりません。archiveType作成するアーカイブの種類。 zipに設定します。archiveFile作成する .zip ファイルの場所。 replaceExistingArchiveファイルが既に存在する場合に、既存のアーカイブを置き換えるかどうかを示します。 trueに設定します。その後、
.zipファイルは、dropという名前の成果物としてパイプラインにアップロードされます。 デプロイ ステージでは、 .zip ファイルを使用してアプリをデプロイします。- upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip displayName: 'Upload package' artifact: drop-
uploadパラメーターは、アップロードする .zip ファイルの場所と名前を設定します。 -
artifactパラメーターは、作成された成果物の名前をdropに設定します。
-
展開段階
デプロイ ステージは、ビルド ステージが正常に完了した場合に実行されます。 この動作は、 dependsOn キーワードと condition キーワードによって定義されます。
dependsOn: Build
condition: succeeded()
デプロイ ステージには、次のように構成された 1 つのデプロイ ジョブが含まれています。
- deployment: DeploymentJob
pool:
vmImage: $(vmImageName)
environment: $(environmentName)
- deployment: DeploymentJob
pool:
name: <your-pool-name>
environment: $(environmentName)
strategy キーワードは、デプロイ戦略を定義します。
strategy:
runOnce:
deploy:
steps:
-
runOnceキーワードは、デプロイ ジョブが 1 回実行されることを指定します。 -
deployキーワードは、デプロイ ジョブで実行するstepsを指定します。
このステージの steps は、次のタスクを実行します。
- UsePythonVersion@0 は、 ビルド ステージと同じように、使用する Python のバージョンを選択します。
-
AzureWebApp@1 は、Web アプリと
dropZIP 成果物をデプロイします。
- task: AzureWebApp@1
displayName: 'Deploy Azure Web App : <your-web-app-name>'
inputs:
azureSubscription: $(azureServiceConnectionId)
appName: $(webAppName)
package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
-
azureSubscriptionパラメーターには、パイプライン変数で指定されたazureServiceConnectionIdが含まれています。 -
appNameには、webAppName変数の値が含まれています。 -
packageは、デプロイする .zip ファイルの名前と場所を指定します。
また、 python-vscode-flask-tutorial リポジトリには startup.txtという名前のファイルにアプリのスタートアップ コマンドが含まれているため、 startUpCommand: 'startup.txt' パラメーターを追加してアプリのスタートアップ コマンドを指定できます。
パイプラインを実行する
これで、パイプラインを試す準備ができました。
パイプライン エディターで、[ 保存して実行] を選択します。
[保存して実行] 画面で、必要に応じてコミット メッセージを追加し、[保存して実行] を選択します。
パイプラインの実行を監視するには、[パイプラインの概要] ページで [ステージ] または [ジョブ] を選択します。 正常に完了すると、各ジョブとステージに緑色のチェック マークが表示されます。 エラーが発生した場合は、概要またはジョブ ステップに表示されます。
[概要] ページの右上にある垂直ドットを選択し、[パイプラインの編集] を選択すると、YAML エディターにすばやく戻ることができます。
デプロイ ジョブから、 [Azure Web アプリのデプロイ] タスクを選択して、その出力を表示します。
出力から、 App Service アプリケーション URL の後の URL を選択します。 アプリは次のように表示されます。
注記
依存関係がないためにアプリのデプロイが失敗した場合、 requirements.txt ファイルはデプロイ中に処理されませんでした。 この問題は、 az webapp up コマンドを使用するのではなく、ポータルで Web アプリを直接作成する場合に発生する可能性があります。
az webapp up コマンドは、ビルド アクション SCM_DO_BUILD_DURING_DEPLOYMENT を true に明示的に設定します。 ポータルを使用してアプリ サービスをプロビジョニングする場合、このアクションは自動的には設定されません。
このアクションを設定するには:
- Web アプリのポータル ページで、左側のナビゲーション メニューから [構成] を選択します。
- [ アプリケーション設定] タブで、[ 新しいアプリケーション設定] を選択します。
- 表示されるポップアップで、 [名前] を
SCM_DO_BUILD_DURING_DEPLOYMENTに設定し、 [値] をtrueに設定して、 [OK]を選びます。 - [構成] ページの上部にある [保存] を選択します。
- パイプラインを再実行します。 これで、デプロイ中に依存関係がインストールされます。
パイプラインの実行をトリガーする
このパイプラインは、変更がコード リポジトリにチェックインされるたびに実行されるように設定されます。 パイプライン実行をトリガーするには、リポジトリに変更をコミットします。 たとえば、新しい機能をアプリに追加したり、アプリの依存関係を更新したりできます。
- アプリの GitHub リポジトリに移動します。
- アプリのタイトルの変更など、コードに変更を加えます。
- 変更をコミットします。
- パイプラインに移動し、新しい実行が作成され、実行されていることを確認します。
- 実行が完了したら、変更が Web アプリにデプロイされたことを確認します。
- Azure portal で Web アプリに移動し、左側のナビゲーション メニューから デプロイ センター を選択します。
- [ ログ ] タブを選択し、新しいデプロイが一覧表示されていることを確認します。
App Service に Django アプリをデプロイする
別のデータベースを使用している場合は、Azure Pipelines を使用して、Django アプリを App Service on Linux にデプロイできます。 App Service は db.sqlite3 ファイルをロックし、読み取りと書き込みの両方を妨げるため、SQLite データベースを使うことはできません。 この動作は、外部データベースには影響しません。
コンテナーの起動プロセスで説明したように、App Service はアプリ コード内の wsgi.py ファイルを自動的に検索します。このファイルには通常、アプリ オブジェクトが含まれます。 スタートアップ コマンドをカスタマイズする場合は、YAML パイプライン ファイルの startUpCommand ステップで AzureWebApp@1 パラメーターを使用します。
Django を使用する場合は、通常、アプリ コードをデプロイした後、 manage.py migrate を使用してデータ モデルを移行する必要があります。 この目的のために、デプロイ後のスクリプトを使用して startUpCommand を追加できます。 たとえば、AzureWebApp@1 タスクの startUpCommand プロパティを次に示します。
- task: AzureWebApp@1
displayName: 'Deploy Azure Web App : $(webAppName)'
inputs:
azureSubscription: $(azureServiceConnectionId)
appName: $(webAppName)
package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
startUpCommand: 'python manage.py migrate'
ビルド エージェントでテストを実行する
ビルド プロセスの一部として、アプリ コードでテストを実行することもできます。 テストはビルド エージェントで実行されるため、ビルド エージェントの仮想環境に依存関係をインストールする必要があります。 テストの実行後、デプロイ用の .zip ファイルを作成する前に、テスト仮想環境を削除します。
次のスクリプト要素は、このプロセスを示したものです。 これらを、 ArchiveFiles@2 ファイルの タスクの前に配置します。 詳しくは、「クロスプラットフォーム スクリプトを実行する」をご覧ください。
# The | symbol is a continuation character, indicating a multi-line script.
# A single-line script can immediately follow "- script:".
- script: |
python -m venv .env
source .env/bin/activate
pip install setuptools
pip install -r requirements.txt
# The displayName shows in the pipeline UI when a build runs
displayName: 'Install dependencies on build agent'
- script: |
# Put commands to run tests here
displayName: 'Run tests'
- script: |
echo Deleting .env
deactivate
rm -rf .env
displayName: 'Remove .env before zip'
PublishTestResults@2 などのタスクを使用して、テスト結果をパイプラインに発行することもできます。 詳細については、「テストの 実行」を参照してください。
リソースをクリーンアップする
このチュートリアルで作成した Azure リソースを完了した場合は、追加の料金が発生しないようにそれらを削除します。
- 作成した Azure DevOps プロジェクトを削除します。 プロジェクトを削除すると、パイプラインとサービス接続が削除されます。
- App Service と App Service プランを含む Azure リソース グループを削除します。 Azure ポータルで、リソース グループに移動し、 [リソース グループの削除] を選択して、プロンプトに従います。
- Cloud Shell ファイル システムを維持する Azure ストレージ アカウントを削除します。 Cloud Shell を閉じ、 cloud-shell-storage- で始まるリソース グループを見つけます。 [ リソース グループの削除] を選択し、プロンプトに従います。