Azure DevOps 服務
本教學課程示範如何使用 Azure Pipelines 進行持續整合和持續傳遞 (CI/CD) ,以建置 Python Web 應用程式並將其部署至 Linux 上的 Azure App Service。 每當認可應用程式程式碼存放庫時,您的管線都會自動建置 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 託管的代理上運行管線。 您可以購買平行作業,也可以申請免費方案。 - YAML 和 Azure Pipelines 的基本知識。 如需詳細資訊,請參閱 建立您的第一個管線。 - 許可權: - 若要建立管線:您必須位於 參與者 群組中,且群組必須將 [建立組建管線 ] 許可權設定為 [允許]。 Project Administrators 群組的成員可以管理管線。 - 若要建立服務連線:您必須具有 管理員 或 建立者 角色以進行 服務連線。 |
| GitHub的 | - GitHub 帳戶。 - 一個用於授權 Azure Pipelines 的 GitHub 服務連線。 |
| 天藍色 | Azure 訂用帳戶。 |
| 產品 | 需求 |
|---|---|
| Azure DevOps | - Azure DevOps 專案。 - 自託管代理程式。 若要建立一個代理程式,請參閱 自我裝載代理程式。 - YAML 和 Azure Pipelines 的基本知識。 如需詳細資訊,請參閱 建立您的第一個管線。 - 許可權: - 若要建立管線:您必須位於 參與者 群組中,且群組必須將 [建立組建管線 ] 許可權設定為 [允許]。 Project Administrators 群組的成員可以管理管線。 - 若要建立服務連線:您必須具有 管理員 或 建立者 角色以進行 服務連線。 |
| GitHub的 | - GitHub 帳戶。 - 一個用於授權 Azure Pipelines 的 GitHub 服務連線。 |
| 天藍色 | Azure 訂用帳戶。 |
設定自我託管代理程式
自我裝載建置代理程式不支援下載 Python 版本。 若要使用您自己的自我裝載代理程式,您必須將代理程式設定為執行 Python。
若要避免相容性問題,在此情況下,請將 Python 版本與 Azure App Services Web 應用程式 3.11 中的執行階段版本相符。 您必須預安裝 Python 版本。 使用完整的安裝程式來取得與 pip 相容的 Python 版本。
所需的 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 網站下載。
準備範例應用程式
將範例 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 教學課程。
關閉瀏覽器視窗,並使用 Ctrl+C 停止 Flask 伺服器。
建立和部署 App Service Web 應用程式
在 Azure 入口網站中使用 Cloud Shell 建立 Azure App Service Web 應用程式。 若要使用 Cloud Shell,請登入 Azure 入口網站 ,然後選取工具列上的 [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-tutorial執行 az webapp up 命令來佈建 App Service Web 應用程式,並執行第一次部署。 使用參數
--name <your-web-app-name>來指派 Azure 中唯一的名稱,例如個人或公司名稱以及應用程式識別碼,例如--name <your-name>-flaskpipelines。 在沒有參數的情況下執行會az webapp up指派隨機產生的 Web 應用程式名稱,該名稱在 Azure 中是唯一的。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 應用程式具有startup.txt檔案,其中包含 Web 應用程式的特定啟動命令。 輸入下列命令,使用您的資源群組和 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 資源。 此存取權僅限於指派給服務主體的角色,可讓您控制可以在哪個層級存取哪些資源。
若要建立服務主體,請在 Bash Cloud Shell 中執行下列命令。 取代 <service-principal-name> 為服務主體的名稱、 <your-subscription-id> Azure 訂用帳戶識別碼,以及 <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 服務連線 ] 畫面上,選取您的 身分識別類型。 此範例使用 應用程式註冊 (自動),建議使用。 如需驗證方法的詳細資訊,請參閱 使用 Azure Resource Manager 服務連線連線至 Azure。
針對 Ification (認證),選取 [工作負載身分聯盟 (自動)] 。
完成下列欄位:
- 範圍層級:選取 [訂用帳戶]。
- 訂閱:選取您的 Azure 訂閱。
- 資源群組:選取包含 Web 應用程式的資源群組。
- 服務連線名稱:輸入連線的描述性名稱。
- 授與所有管線的存取權限:選取此核取方塊,以授與專案中所有管線的存取權。
選取儲存。
在您的 Azure DevOps 專案頁面上,選取 [專案設定]。
從 [專案設定] 中,選取 [管線>服務連線]。
在 [服務連線 ] 頁面上,選取 [新增服務連線 ] 或 [建立服務連線 ] (如果此服務連線是專案中的第一個服務連線)。
在 [ 新增服務連線 ] 畫面上,選取 [Azure Resource Manager] ,然後選取 [ 下一步]。
選取 [ 服務主體 (手動) ],然後選取 [ 下一步]。
在 [新增 Azure 服務連線 ] 畫面上,完成下列欄位:
- 環境:選取 [Azure 雲端]。
- 範圍層級:選取 [訂用帳戶]。
- 訂用帳戶識別碼:輸入您的 Azure 訂用帳戶識別碼。
- 訂用帳戶名稱:輸入您的 Azure 訂用帳戶名稱。
在 「驗證」 區段中,完成下列欄位:
-
服務主體識別碼:輸入命令傳回的
appIdaz ad sp create-for-rbac值。 - 認證:選取 服務主體金鑰。
-
服務主體索引鍵:輸入命令傳回的
passwordaz ad sp create-for-rbac值。 -
租用戶識別碼:輸入命令傳回的
tenantaz ad sp create-for-rbac值。 - 選取 [ 驗證 ] 以確認連線。
-
服務主體識別碼:輸入命令傳回的
在 [詳細資料 ] 區段的 [服務連線名稱] 底下,輸入服務連線的名稱。
選取 [授與所有管線的存取權限] 核取方塊。
選擇 確認並儲存。
新連線會出現在 [服務連線 ] 清單中,並已準備好在管線中使用。
建立管線
建立一個管道,將您的 Python 網頁應用程式建置並部署到 Azure App 服務。
在專案的左側導覽功能表上,選取 [管線]。
在 [管線] 頁面上,選取 [新增管線],或選取 [建立管線 ] (如果此管線是專案中的第一個管線)。
在 [ 在哪裡] 程式代碼 畫面上,選取 [GitHub]。 系統可能會提示您登入 GitHub。
在 [ 選取存放庫 ] 畫面上,選取分支範例存放庫。 GitHub 可能會提示您再次輸入 GitHub 密碼,或安裝 Azure Pipelines GitHub 應用程式。 按照屏幕上的指示安裝應用程序。 如需詳細資訊,請參閱 GitHub 應用程式驗證。
在 [設定管線] 頁面上,選取 [Azure 上的 Python 到 Linux Web App]。
在下一個畫面上,選取您的 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命令的az webapp upJSON 輸出。
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'
變數
variables YAML 檔案開頭的區段會定義下列變數:
| 變數 | 說明 |
|---|---|
azureServiceConnectionId |
Azure Resource Manager 服務連線的識別碼。 |
webAppName |
App Service Web 應用程式的名稱。 |
vmImageName |
要用於組建代理程式的作業系統名稱。 |
environmentName |
要部署的環境名稱,在部署工作執行時自動建立。 |
projectRoot |
包含應用程式程式代碼的根資料夾。 |
pythonVersion |
在組建和部署代理程式上使用的 Python 版本。 |
| 變數 | 說明 |
|---|---|
azureServiceConnectionId |
Azure Resource Manager 服務連線的識別碼。 |
webAppName |
App Service Web 應用程式的名稱。 |
environmentName |
要部署的環境名稱,在部署工作執行時自動建立。 |
projectRoot |
包含應用程式程式代碼的資料夾。 值是自動系統變數。 |
pythonVersion |
在組建和部署代理程式上使用的 Python 版本。 |
建置和部署階段
管線包含建置和部署階段。
建置階段
建置階段包含在變數中 vmImageName 定義的作業系統上執行的單一工作,在此案例 ubuntu-latest中為 。
- job: BuildJob
pool:
vmImage: $(vmImageName)
建置階段包含在參數所pool識別的代理程式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 環境,並從 安裝
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。
- 此
部署階段
如果建置階段成功完成,部署階段就會執行。 和dependsOncondition關鍵字定義了此行為。
dependsOn: Build
condition: succeeded()
部署階段包含單一部署作業,設定如下。
- deployment: DeploymentJob
pool:
vmImage: $(vmImageName)
environment: $(environmentName)
- deployment: DeploymentJob
pool:
name: <your-pool-name>
environment: $(environmentName)
strategy關鍵字定義部署策略。
strategy:
runOnce:
deploy:
steps:
-
runOnce關鍵詞會指定部署作業執行一次。 -
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 檔案。 如果您直接在入口網站中建立 Web 應用程式,而不是使用 az webapp up 命令,則可能會發生此問題。
az webapp up命令會特別將建置動作SCM_DO_BUILD_DURING_DEPLOYMENT設定為 true。 如果您透過入口網站佈建應用程式服務,則不會自動設定此動作。
若要設定此動作:
- 在 Web 應用程式的入口網站頁面上,從左側導覽功能表中選取 [設定 ]。
- 在 [應用程式設定 ] 索引標籤上,選取 [新增應用程式設定]。
- 在出現的彈出視窗中,將 [名稱] 設定為 ,將 [值] 設定為
SCM_DO_BUILD_DURING_DEPLOYMENT,然後選取 [true]。 - 選擇儲存位於設定頁面頂端。
- 再次執行資料處理流程。 依附元件現在應該會在部署期間安裝。
觸發流水線執行
此管線會設定為每當變更簽入程式碼存放庫時執行。 若要觸發管線執行,請提交變更至存放庫。 例如,您可以將新功能新增至應用程式,或更新應用程式的相依性。
- 移至應用程式的 GitHub 存放庫。
- 變更程式代碼,例如變更應用程式的標題。
- 認可變更。
- 移至您的管線,並確認已建立新的執行並正在執行。
- 執行完成時,請確認變更已部署至您的 Web 應用程式。
- 在 Azure 入口網站中,移至您的 Web 應用程式,然後從左側導覽功能表中選取 [部署中心 ]。
- 選取 [記錄] 索引標籤,並確認已列出新部署。
將 Django 應用程式部署至 App Service
如果您使用個別的資料庫,您可以使用 Azure Pipelines 將 Django 應用程式部署至 Linux 上的 App Service。 您無法使用 SQLite 資料庫,因為 App Service 會 鎖定 db.sqlite3 檔案,避免讀取和寫入。 此行為不會影響外部資料庫。
如 容器啟動程式中所述,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 檔案。
下列文稿元素說明此程式。 將它們放在azure-pipelines.ymlArchiveFiles@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- 開頭的資源群組。 選取 [刪除資源群組],然後依照提示進行。