使用 Azure Pipelines 建置和部署 Python Web 應用程式以 Azure App 服務
Azure DevOps Services
使用 Azure Pipelines 持續整合和持續傳遞 (CI/CD) 來建置 Python Web 應用程式,並在 Linux 上 Azure App 服務。 每當存放庫認可時,管線會自動建置 Python Web 應用程式並將其部署至 App Service。
在本文中,您將學會如何:
- 在 Azure App 服務 中建立 Web 應用程式。
- 在 Azure DevOps 中建立專案。
- 將您的DevOps項目連線至 Azure。
- 建立 Python 特定的管線。
- 執行管線,以在App Service 中建置應用程式並將其部署至 Web 應用程式。
必要條件
為您的應用程式程式代碼建立存放庫
將範例 https://github.com/Microsoft/python-sample-vscode-flask-tutorial 存放庫分支至您的 GitHub 帳戶。
在您的本機主機上,複製您的 GitHub 存放庫。 使用下列命令,將 <repository-url>
取代為分支存放庫的URL。
git clone <repository-url>
在本機測試您的應用程式
在本機建置並執行應用程式,以確定其運作正常。
變更為複製的存放庫資料夾。
cd python-sample-vscode-flask-tutorial
建置並執行應用程式
python -m venv .env source .env/bin/activate pip install --upgrade pip pip install -r ./requirements.txt export set FLASK_APP=hello_app.webapp python3 -m flask run
若要檢視應用程式,請開啟瀏覽器視窗並移至 http://localhost:5000。 確認您看到標題
Visual Studio Flask Tutorial
。當您完成時,請關閉瀏覽器視窗,並使用 Ctrl+C 停止 Flask 伺服器。
開啟 Cloud Shell
登入 Azure 入口網站:https://portal.azure.com。
選取入口網站工具列上的 [Cloud Shell] 按鈕,以開啟 Azure CLI。
Cloud Shell 會出現在瀏覽器底部。 從下拉功能表中選取 [Bash ]。
若要提供更多可用空間,請選取 [最大化] 按鈕。
建立 Azure App 服務 Web 應用程式
在 Azure 入口網站 中,從 Cloud Shell 建立您的 Azure App 服務 Web 應用程式。
提示
若要貼到 Cloud Shell 中,請使用 Ctrl+Shift+V 或按滑鼠右鍵,然後從操作功能表中選取 [貼上]。
使用下列命令複製您的存放庫,並將 取代
<repository-url>
為分支存放庫的URL。git clone <repository-url>
將目錄變更為複製的存放庫資料夾,因此
az webapp up
命令會將應用程式辨識為 Python 應用程式。cd python-sample-vscode-flask-tutorial
使用 az webapp up 命令來布建 App Service 並執行應用程式的第一個部署。 將取代
<your-web-app-name>
為跨 Azure 唯一的名稱。 一般而言,您會使用個人或公司名稱以及應用程式識別碼,例如<your-name>-flaskpipelines
。 應用程式 URL 會變成 your-appservice.azurewebsites.net>。<az webapp up --name <your-web-app-name>
命令的
az webapp up
JSON 輸出會顯示:{ "URL": <your-web-app-url>, "appserviceplan": <your-app-service-plan-name>, "location": <your-azure-location>, "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
請注意 和runtime_version
值。runtime_version
您可以在管線 YAML 檔案中使用 。URL
是 Web 應用程式的 URL。 您可以使用它來確認應用程式正在執行。注意
az webapp up
命令會執行下列動作:建立預設資源群組。
建立預設 App Service 方案。
使用所指定的名稱建立應用程式。
Zip 會從目前的工作目錄部署 所有檔案,並啟用組建自動化。
在 .azure/config 檔案中本機快取參數,這樣您就不需要在稍後使用
az webapp up
或其他來自專案資料夾的az webapp
命令進行部署時再次加以指定。 預設會自動使用快取的值。
您可以使用命令參數,以您自己的值覆寫默認動作。 如需詳細資訊,請參閱 az webapp up。
python-sample-vscode-flask-tutorial 應用程式具有startup.txt檔案,其中包含 Web 應用程式的特定啟動命令。 將 Web 應用程式
startup-file
群組態屬性設定為startup.txt
。az webapp up
從命令輸出複製resourcegroup
值。使用資源群組和您的應用程式名稱,輸入下列命令。
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 Tutorial
。
建立 Azure DevOps 專案
建立新的 Azure DevOps 專案。
- 在瀏覽器中,移至 dev.azure.com 並登入。
- 選取您的組織。
- 選取 [新增專案 ] 或 [在組織中建立第一個專案時建立專案],以建立新的專案 。
- 輸入專案名稱。
- 選取項目的可見度。
- 選取 建立。
- 在瀏覽器中,移至您的 Azure DevOps Server。
- 選取您的集合。
- 選取 [新增專案 ] 或 [在集合中建立第一個專案時建立專案],以建立新的專案 。
- 輸入專案名稱。
- 選取項目的可見度。
- 選取 建立。
建立服務主體
服務主體是為了與應用程式、裝載的服務及自動化工具搭配使用來存取 Azure 資源而建立的身分識別。 此存取權僅限於指派給服務主體的角色,讓您控制哪些資源可以存取和層級。
若要建立服務主體,請移至 Cloud Shell (bash),然後執行下列命令。 將 取代 <service-principal-name>
為服務主體的名稱、 <your-subscription-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 物件:
{
"clientId": "<client GUID>",
"clientSecret": "<string-value>",
"subscriptionId": "<subscription GUID>",
"tenantId": "<tenant GUID>",
...
}
記下 clientId
、 clientSecret
、 subscriptionId
和 tenantId
值。 您需要這些值,才能在下一節中建立服務連線。
建立服務連線
服務連線可讓您建立連線,以提供從 Azure Pipelines 到外部和遠端服務的已驗證存取權。 若要部署至 Azure App 服務 Web 應用程式,請建立包含 Web 應用程式的資源群組服務連線。
在項目頁面上,選取 [項目設定]。
在功能表的 [管線] 區段中,選取 [服務連線]。
選取建立服務連線。
選取 [Azure Resource Manager ],然後選取 [ 下一步]。
選取您的驗證方法,然後選取 [ 下一步]。
在 [ 新增 Azure 服務連線 ] 對話框中,輸入所選驗證方法的特定資訊。 如需驗證方法的詳細資訊,請參閱 使用 Azure Resource Manager 服務連線連線至 Azure。
例如,如果您使用 工作負載身分識別同盟(自動) 或服務 主體(自動) 驗證方法,請輸入必要的資訊。
欄位 說明 範圍層級 選取 [訂用帳戶]。 訂用帳戶 您的 Azure 訂用帳戶名稱。 資源群組 包含 Web 應用程式的資源群組名稱。 服務連線名稱 連接的描述性名稱。 授與所有管線的訪問許可權 選取此選項可授與所有管線的存取權。 選取儲存。
新的聯機會出現在 [ 服務連線 ] 清單中,並準備好在 Azure Pipeline 中使用。
在項目頁面上,選取 [項目設定]。
在功能表的 [管線] 區段中,選取 [服務連線]。
選取建立服務連線。
選取 [Azure Resource Manager ],然後選取 [ 下一步]。
在 [新增 Azure 服務連線] 上,選取 [服務主體][手動],然後選取 [下一步]
在下一個對話框中,填寫必要資訊。
欄位 說明 環境 選取 Azure Cloud
。範圍層級 選取 [訂用帳戶]。 訂用帳戶標識碼 您的訂用帳戶識別碼。 訂用帳戶名稱 您的 Azure 訂用帳戶名稱。 服務主體標識碼 appId
命令所az ad sp create-for-rbac
傳回之 JSON 物件的值。服務主體金鑰 password
命令所az ad sp create-for-rbac
傳回之 JSON 物件的值。租用戶標識碼 tenant
命令所az ad sp create-for-rbac
傳回之 JSON 物件的值。選取 [ 驗證 ] 以確認連線。
輸入服務連線名稱。
確定 已選取 [授與所有管線的訪問許可權 ]。
選取 [確認並儲存]。
新的聯機會出現在 [ 服務連線 ] 清單中,並準備好讓 Azure Pipelines 從專案使用。
設定自我裝載代理程式
如果您使用自己的自我裝載代理程式,您必須將代理程式設定為執行 Python。 自我裝載代理程式不支援下載 Python 版本。 您必須預安裝 Python 版本。 使用完整的安裝程式來取得與 pip 相容的 Python 版本。
若要避免不相容的問題,您應該比對 Python 版本與 Azure App 服務 Web 應用程式上的運行時間版本。 運行時間版本會顯示在命令的 az webapp up
JSON 輸出中。
所需的 Python 版本必須新增至自我裝載代理程式上的工具快取,讓工作可以使用它。 一般而言,工具快取位於代理程式的 _work/_tool 目錄底下;或者,可以使用環境變數AGENT_TOOLSDIRECTORY覆寫路徑。 在工具目錄底下,根據 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 網站下載。
建立管線
建立管線來建置和部署 Python Web 應用程式,以 Azure App 服務。 若要瞭解管線概念,請觀看:
在左側導覽功能表上,選取 [ 管線]。
選取建立管線。
在 [ 在哪裡是您的程序代碼 ] 對話框中,選取 [GitHub]。 系統可能會提示您登入 GitHub。
在 [ 選取存放庫 ] 畫面上,選取分岔範例存放庫。
系統可能會提示您再次輸入 GitHub 密碼作為確認。
如果未在 GitHub 上安裝 Azure Pipelines 擴充功能,GitHub 會提示您安裝 Azure Pipelines 擴充功能。
在此頁面上,向下捲動至 [ 存放庫存取 ] 區段,選擇是要在所有存放庫上安裝擴充功能,還是只選取選取的存放庫,然後選取 [ 核准並安裝]。
在 [ 設定管線] 對話框中,選取 [Python 至 Azure 上的 Linux Web 應用程式]。
選取您的 Azure 訂用帳戶,然後選取 [ 繼續]。
如果您使用使用者名稱和密碼進行驗證,瀏覽器隨即開啟,讓您登入Microsoft帳戶。
從下拉式清單中選取您的 Web 應用程式名稱,然後選取 [ 驗證並設定]。
Azure Pipelines 會 建立azure-pipelines.yml 檔案,並將其顯示在 YAML 管線編輯器中。 管線檔案會將 CI/CD 管線定義為一系列階段、作業和步驟,其中每個步驟都包含不同工作和腳本的詳細數據。 查看管線以了解其作用。 請確定所有預設輸入都適合您的程式代碼。
在導覽功能表上,選取 [ 管線]。
選取建立管線。
在 [ 在哪裡是您的程序代碼 ] 對話框中,選取 [GitHub Enterprise Server]。 系統可能會提示您登入 GitHub。
在 [ 選取存放庫 ] 索引卷標上,選取分叉範例存放庫。
系統可能會提示您再次輸入 GitHub 密碼作為確認。
如果未在 GitHub 上安裝 Azure Pipelines 擴充功能,GitHub 會提示您安裝 Azure Pipelines 擴充功能。
在此頁面上,向下捲動至 [ 存放庫存取 ] 區段,選擇是要在所有存放庫上安裝擴充功能,還是只選取選取的存放庫,然後選取 [ 核准並安裝]。
在 [ 設定管線] 對話框中,選取 [ 入門管線]。
使用下列程式代碼取代azure-pipelines.yml檔案的內容。
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'
以您自己的值取代下列佔位元:
預留位置 說明 <your-service-connection-name>
您建立的服務連線名稱。 <your-web-app-name>
Azure App 服務 Web 應用程式的名稱。 <your-pool-name>
您想要使用的代理程式集區名稱。 <your-python-version>
在您的代理程式上執行的 Python 版本。 最好將此版本與在 Web 應用程式上執行的 Python 版本相符。 Web 應用程式版本會顯示在命令的 az webapp up
JSON 輸出中。
YAML 管線檔案
下列說明說明 YAML 管線檔案。 若要瞭解管線 YAML 檔案架構,請參閱 YAML 架構參考。
完整的範例管線 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 setup
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
變數
區 variables
段包含下列變數:
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.
projectRoot: $(System.DefaultWorkingDirectory)
# Python version: 3.11. Change this to match the Python runtime version running on your web app.
pythonVersion: '3.11'
變數 | 說明 |
---|---|
azureServiceConnectionId |
Azure Resource Manager 服務連線的標識碼或名稱。 |
webAppName |
Azure App Service Web 應用程式的名稱。 |
vmImageName |
要用於組建代理程式的作業系統名稱。 |
environmentName |
部署階段中使用的環境名稱。 執行階段作業時,系統會自動建立環境。 |
projectRoot |
包含應用程式程式代碼的根資料夾。 |
pythonVersion |
在組建和部署代理程式上使用的 Python 版本。 |
區 variables
段包含下列變數:
variables:
# Azure Resource Manager connection created during pipeline creation
azureServiceConnectionId: '<your-service-connection-name>'
# Web app name
webAppName: '<your-webapp-name>'
# Environment name
environmentName: '<your-webapp-name>'
# Project root folder.
projectRoot: $(System.DefaultWorkingDirectory)
# Python version: 3.11. Change this to the version that is running on your agent and web app.
pythonVersion: '3.11'
變數 | 說明 |
---|---|
azureServiceConnectionId |
Azure Resource Manager 服務連線的名稱。 |
webAppName |
Web 應用程式的名稱。 |
environmentName |
部署階段中使用的環境名稱。 |
projectRoot |
包含應用程式程式代碼的資料夾。 值是自動系統變數。 |
pythonVersion |
在組建和部署代理程式上使用的 Python 版本。 |
建置階段
建置階段包含單一作業,可在 vmImageName 變數中定義的作業系統上執行。
- job: BuildJob
pool:
vmImage: $(vmImageName)
建置階段包含單一作業,可在 name 參數所識別集區中的代理程式上執行。 您可以使用 關鍵字來指定代理程式功能 demands
。 例如, demands: python
指定代理程式必須已安裝 Python。 若要依名稱指定自我裝載代理程式,您可以使用 demands: Agent.Name -equals <agent-name>
關鍵詞。
- job: BuildJob
pool:
name: <your-pool-name>
demands: python
工作包含多個步驟:
UsePythonVersion 工作會選取要使用的 Python 版本。 版本定義於變數中
pythonVersion
。- task: UsePythonVersion@0 inputs: versionSpec: '$(pythonVersion)' displayName: 'Use Python $(pythonVersion)'
此步驟會使用腳本來建立虛擬 Python 環境,並安裝 包含在 參數
workingDirectory
中的requirements.txt
應用程式相依性,以指定應用程式程式碼的位置。- script: | python -m venv antenv source antenv/bin/activate python -m pip install --upgrade pip pip install setup pip install -r ./requirements.txt workingDirectory: $(projectRoot) displayName: "Install requirements"
ArchiveFiles 工作會建立包含 Web 應用程式的.zip封存。 檔案
.zip
會上傳至管線作為名為drop
的成品。 檔案.zip
會用於部署階段,將應用程式部署至 Web 應用程式。- 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
參數 說明 rootFolderOrFile
應用程式程式代碼的位置。 includeRootFolder
指出是否要在.zip檔案中包含根資料夾。 否則,請將此參數設定為 false
,.zip檔案的內容會放在名為 s 的資料夾,且 Linux 上的 App Service 容器找不到應用程式程式代碼。archiveType
要建立的封存類型。 設定為 zip
。archiveFile
要建立.zip檔案的位置。 replaceExistingArchive
指出如果檔案已經存在,是否要取代現有的封存。 設定為 true
。upload
要上傳.zip檔案的位置。 artifact
要建立的成品名稱。
部署階段
如果建置階段成功完成,則會執行部署階段。 下列關鍵詞會定義此行為:
dependsOn: Build
condition: succeeded()
部署階段包含以下列關鍵詞設定的單一部署作業:
- deployment: DeploymentJob
pool:
vmImage: $(vmImageName)
environment: $(environmentName)
關鍵字 | 說明 |
---|---|
deployment |
指出作業是以環境為目標的部署作業。 |
pool |
指定部署代理程式集區。 如果未指定名稱,則為預設代理程式集區。 關鍵詞 vmImage 會識別代理程式虛擬機映像的作業系統 |
environment |
指定要部署的環境。 執行作業時,系統會自動在您的專案中建立環境。 |
- deployment: DeploymentJob
pool:
name: <your-pool-name>
environment: $(environmentName)
關鍵字 | 說明 |
---|---|
deployment |
指出作業是以環境為目標的部署作業。 |
pool 指定要用於部署的代理程式集區。 此集區必須包含代理程式,且能夠執行管線中指定的 Python 版本。 |
|
environment |
指定要部署的環境。 執行作業時,系統會自動在您的專案中建立環境。 |
關鍵詞 strategy
可用來定義部署策略。 runOnce
關鍵詞會指定部署作業執行一次。 deploy
關鍵詞會指定要在部署作業中執行的步驟。
strategy:
runOnce:
deploy:
steps:
steps
管線中的 為:
使用UsePythonVersion工作來指定要在代理程式上使用的 Python 版本。 版本定義於變數中
pythonVersion
。- task: UsePythonVersion@0 inputs: versionSpec: '$(pythonVersion)' displayName: 'Use Python version'
使用 AzureWebApp@1 部署 Web 應用程式。 此工作會將管線成品
drop
部署至您的 Web 應用程式。- 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
要使用的 Azure Resource Manager 服務連線標識碼或名稱。 appName
Web 應用程式的名稱。 package
要部署.zip檔案的位置。 此外,因為 python-vscode-flask-tutorial 存放庫在名為 startup.txt 的檔案中包含相同的啟動命令,因此您可以藉由新增 參數來指定該檔案:
startUpCommand: 'startup.txt'
。
steps
管線中的 為:
使用UsePythonVersion工作來指定要在代理程式上使用的 Python 版本。 版本定義於變數中
pythonVersion
。- task: UsePythonVersion@0 inputs: versionSpec: '$(pythonVersion)' displayName: 'Use Python version'
使用 AzureWebApp@1 部署 Web 應用程式。 此工作會將管線成品
drop
部署至您的 Web 應用程式。- 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
要使用的 Azure Resource Manager 服務連線標識碼或名稱。 appName
Web 應用程式的名稱。 package
要部署.zip檔案的位置。 此外,因為 python-vscode-flask-tutorial 存放庫在名為 startup.txt 的檔案中包含相同的啟動命令,因此您可以藉由新增 參數來指定該檔案:
startUpCommand: 'startup.txt'
。- task: AzureWebApp@1 displayName: 'Deploy Azure Web App : $(webAppName)' inputs: azureSubscription: $(azureServiceConnectionId) appName: $(webAppName) package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip startUpCommand: 'startup.txt'
參數 說明 azureSubscription
要使用的 Azure Resource Manager 服務連線標識碼或名稱。 appName
Web 應用程式的名稱。 package
要部署.zip檔案的位置。 startUpCommand
部署應用程式之後要執行的命令。 範例應用程式會使用 startup.txt
。
執行管線
您現在已準備好試試看!
在編輯器中,選取 [ 儲存並執行]。
在 [ 儲存並執行 ] 對話框中,新增認可訊息,然後選取 [ 儲存並執行]。
您可以選取管線執行摘要中的 [階段] 或 [作業] 來監看管線執行。
每個階段和作業旁邊都有綠色複選標記,因為它成功完成。 如果發生錯誤,它們會顯示在摘要或作業步驟中。
您可以選取 [摘要] 頁面右上方的垂直點,然後選取 [編輯管線],以快速返回 YAML 編輯器:
從部署作業中,選取 [部署 Azure Web 應用程式 ] 工作以顯示其輸出。 若要流覽已部署的網站,請按住 Ctrl ,然後在 之後
App Service Application URL
選取 URL。如果您使用範例應用程式,應用程式應該會顯示如下:
重要
如果您的應用程式因為缺少相依性而失敗,則部署期間未處理您的 requirements.txt 檔案。 如果您直接在入口網站上建立 Web 應用程式,而不是使用如本文所示的命令, az webapp up
就會發生此行為。
az webapp up
命令會特別將建置動作SCM_DO_BUILD_DURING_DEPLOYMENT
設定為 true
。 如果您透過入口網站布建應用程式服務,則不會自動設定此動作。
下列步驟會設定動作:
- 開啟 Azure 入口網站,選取您的 App Service,然後選取 [設定]。
- 在 [ 應用程式設定] 索引標籤底下,選取 [ 新增應用程式設定]。
- 在出現的彈出視窗中,將 [名稱] 設定為 ,將 [值] 設定為
SCM_DO_BUILD_DURING_DEPLOYMENT
true
,然後選取 [確定]。 - 選取 [設定] 頁面頂端的 [儲存]。
- 再次執行管線。 您的相依性應該在部署期間安裝。
觸發管線執行
若要觸發管線執行,請將變更認可至存放庫。 例如,您可以將新功能新增至應用程式,或更新應用程式的相依性。
- 移至 GitHub 存放庫。
- 變更程式代碼,例如變更應用程式的標題。
- 將變更認可至您的存放庫。
- 移至您的管線,並確認已建立新的執行。
- 執行完成時,請確認新的組建已部署至您的 Web 應用程式。
- 在 Azure 入口網站 中,移至您的 Web 應用程式。
- 選取 [部署中心 ],然後選取 [ 記錄] 索引標籤。
- 確認已列出新的部署。
Django 的考慮
如果您使用個別的資料庫,您可以使用 Azure Pipelines 將 Django 應用程式部署至 Linux 上的 Azure App 服務。 您無法使用 SQLite 資料庫,因為 App Service 會 鎖定 db.sqlite3 檔案,避免讀取和寫入。 此行為不會影響外部資料庫。
如在 App Service 上設定 Python 應用程式 - 容器啟動程式中所述,App Service 會自動在應用程式程式代碼中尋找 wsgi.py 檔案,這通常包含應用程式物件。 如果您想要以任何方式自定義啟動命令,請使用 startUpCommand
YAML 管線檔案步驟中的 AzureWebApp@1
參數,如上一節所述。
使用 Django 時,您通常會想要在部署應用程式程式代碼之後使用 manage.py migrate
來移轉數據模型。 您可以針對此目的,使用部署後腳本來新增 startUpCommand
。 例如,以下是 startUpCommand
AzureWebApp@1工作中的屬性。
- 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 檔案。 下列文稿元素說明此程式。 將它們放在azure-pipelines.yml檔案中的工作之前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 的工作,將測試結果發佈至管線。 如需詳細資訊,請參閱 建置 Python 應用程式 - 執行測試。
清除資源
若要避免在本教學課程中建立的 Azure 資源產生費用:
刪除您建立的專案。 刪除專案會刪除管線和服務連線。
刪除包含 App Service 和 App Service 方案的 Azure 資源群組。 在 Azure 入口網站 中,移至資源群組,選取 [刪除資源群組],然後遵循提示。
刪除維護 Cloud Shell 檔案系統的記憶體帳戶。 關閉 Cloud Shell,然後移至以 cloud-shell-storage 開頭的資源群組,選取 [ 刪除資源群組],然後遵循提示。