共用方式為


使用 Azure Pipelines 建置並部署 Python 網站到 Azure App 服務

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.completex64.complete 的 0 位元組檔案,而且只是表示工具已在快取中正確安裝。

例如,若要在 64 位元 Windows 機器上使用 Python 3.11,請建立下列目錄結構:

$AGENT_TOOLSDIRECTORY/
    Python/
        3.11.4/
            x64/
                {python files}
            x64.complete

如果託管代理程式的機器已經具有您要使用的 Python 版本,您可以將檔案複製到工具快取。 如果您沒有 Python 版本,您可以從 Python 網站下載。

準備範例應用程式

  1. 將範例 https://github.com/Microsoft/python-sample-vscode-flask-tutorial 存放庫分支至您的 GitHub 帳戶。

  2. 使用 git clone <your-forked-repository-url>.git將分支複製到本機電腦。

  3. 使用 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
    
  4. 若要測試應用程式,請移至瀏覽器視窗中, http://localhost:5000 並確認您看到標題 Visual Studio Flask 教學課程

  5. 關閉瀏覽器視窗,並使用 Ctrl+C 停止 Flask 伺服器。

建立和部署 App Service Web 應用程式

在 Azure 入口網站中使用 Cloud Shell 建立 Azure App Service Web 應用程式。 若要使用 Cloud Shell,請登入 Azure 入口網站 ,然後選取工具列上的 [Cloud Shell] 按鈕。

Azure 入口網站 工具列上 Azure Cloud Shell 按鈕的螢幕快照。

Cloud Shell 會出現在瀏覽器底部。 請確定已在下拉式功能表中選取 Bash 作為環境。 您可以將 Cloud Shell 視窗最大化,為自己提供更多空間。

Azure Cloud Shell 的螢幕擷取畫面。

提示

若要貼到 Cloud Shell 中,請使用 Ctrl+Shift+V 或按一下滑鼠右鍵,然後從內容功能表中選取 [貼上 ]。

建立和部署 Web 應用程式

  1. 在 Cloud Shell 中,使用下列命令將分支存放庫複製到 Azure,並取代 <your-forked-repository-url> 為分支存放庫的 URL。

    git clone <your-forked-repository-url>
    
  2. 將目錄變更為複製的儲存庫資料夾。

    cd python-sample-vscode-flask-tutorial
    
  3. 執行 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 應用程式,並採取下列動作:

  1. 建立預設 資源群組
  2. 建立預設的 App Service 方案
  3. 建立具有指派名稱的 Web 應用程式。 該應用程序 URL<your-web-app-name>.azurewebsites.net.
  4. 將目前工作目錄中的所有檔案部署到 ZIP 封存,並啟用建置自動化。
  5. 將參數在本機快取在 .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>
}

記錄 URLresourcegroupruntime_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下一節中用來建立服務連線的 、 passwordtenantId 值。

建立服務連線

服務連線提供從 Azure Pipelines 到外部和遠端服務的已驗證存取。 若要部署至 Azure App Service Web 應用程式,請建立 Web 應用程式資源群組的服務連線。

  1. 在您的 Azure DevOps 專案頁面上,選取 [專案設定]。

  2. [專案設定] 中,選取 [管線>服務連線]。

  3. [服務連線 ] 頁面上,選取 [新增服務連線 ] 或 [建立服務連線 ] (如果此服務連線是專案中的第一個服務連線)。

    在 [專案設定] 中選取 [管線服務連線] 的螢幕擷取畫面。

  4. 在 [ 新增服務連線 ] 畫面上,選取 [Azure Resource Manager] ,然後選取 [ 下一步]。

    Azure Resource Manager 服務連線選取項目的螢幕快照。

  5. 在 [ 新增 Azure 服務連線 ] 畫面上,選取您的 身分識別類型。 此範例使用 應用程式註冊 (自動),建議使用。 如需驗證方法的詳細資訊,請參閱 使用 Azure Resource Manager 服務連線連線至 Azure。

  6. 針對 Ification (認證),選取 [工作負載身分聯盟 (自動)]

  7. 完成下列欄位:

    • 範圍層級:選取 [訂用帳戶]。
    • 訂閱:選取您的 Azure 訂閱。
    • 資源群組:選取包含 Web 應用程式的資源群組。
    • 服務連線名稱:輸入連線的描述性名稱。
    • 授與所有管線的存取權限:選取此核取方塊,以授與專案中所有管線的存取權。
  8. 選取儲存

    [新增 Azure 服務連線] 對話方塊的螢幕擷取畫面。

  1. 在您的 Azure DevOps 專案頁面上,選取 [專案設定]。

  2. [專案設定] 中,選取 [管線>服務連線]。

  3. [服務連線 ] 頁面上,選取 [新增服務連線 ] 或 [建立服務連線 ] (如果此服務連線是專案中的第一個服務連線)。

    項目儀錶板上項目設定按鈕的螢幕快照。

  4. 在 [ 新增服務連線 ] 畫面上,選取 [Azure Resource Manager] ,然後選取 [ 下一步]。

    顯示 Azure Resource Manager 選取項目的螢幕快照。

  5. 選取 [ 服務主體 (手動) ],然後選取 [ 下一步]。

    顯示選取服務主體(手動)驗證方法選取的螢幕快照。

  6. [新增 Azure 服務連線 ] 畫面上,完成下列欄位:

    • 環境:選取 [Azure 雲端]。
    • 範圍層級:選取 [訂用帳戶]。
    • 訂用帳戶識別碼:輸入您的 Azure 訂用帳戶識別碼。
    • 訂用帳戶名稱:輸入您的 Azure 訂用帳戶名稱。
  7. 「驗證」 區段中,完成下列欄位:

    • 服務主體識別碼:輸入命令傳回的appIdaz ad sp create-for-rbac值。
    • 認證:選取 服務主體金鑰
    • 服務主體索引鍵:輸入命令傳回的passwordaz ad sp create-for-rbac值。
    • 租用戶識別碼:輸入命令傳回的tenantaz ad sp create-for-rbac值。
    • 選取 [ 驗證 ] 以確認連線。
  8. [詳細資料 ] 區段的 [服務連線名稱] 底下,輸入服務連線的名稱。

  9. 選取 [授與所有管線的存取權限] 核取方塊。

  10. 選擇 確認並儲存

    新服務連線畫面頂端的螢幕擷取畫面。

新連線會出現在 [服務連線 ] 清單中,並已準備好在管線中使用。

建立管線

建立一個管道,將您的 Python 網頁應用程式建置並部署到 Azure App 服務。

  1. 在專案的左側導覽功能表上,選取 [管線]。

  2. [管線] 頁面上,選取 [新增管線],或選取 [建立管線 ] (如果此管線是專案中的第一個管線)。

    管線清單上新管線按鈕的螢幕快照。

  3. 在 [ 在哪裡] 程式代碼 畫面上,選取 [GitHub]。 系統可能會提示您登入 GitHub。

    選取 GitHub 作為程式碼位置的螢幕擷取畫面。

  4. 在 [ 選取存放庫 ] 畫面上,選取分支範例存放庫。 GitHub 可能會提示您再次輸入 GitHub 密碼,或安裝 Azure Pipelines GitHub 應用程式。 按照屏幕上的指示安裝應用程序。 如需詳細資訊,請參閱 GitHub 應用程式驗證

    儲存庫選擇的螢幕快照。

  5. [設定管線] 頁面上,選取 [Azure 上的 Python 到 Linux Web App]。

  6. 在下一個畫面上,選取您的 Azure 訂用帳戶,然後選取 [繼續]。

  7. 在下一個畫面上,選取您的 Azure Web 應用程式,然後選取 [驗證並設定]。

Azure Pipelines 會建立 azure-pipelines.yml 檔案,並將其顯示在 YAML 管線編輯器中。

  1. 在專案的左側導覽功能表上,選取 [管線]。

  2. [管線] 頁面上,選取 [新增管線],或選取 [建立管線 ] (如果此管線是專案中的第一個管線)。

    管線清單上新管線按鈕的螢幕快照。

  3. 在 [ 您的程式代碼在哪裡 ] 頁面上,選取 [GitHub Enterprise Server]。 系統可能會提示您登入 GitHub。

    選取 GitHub 作為程式代碼位置的螢幕快照。

  4. [選取存放庫 ] 索引標籤上,選取您的分支範例存放庫。 GitHub 可能會提示您再次輸入 GitHub 密碼,或安裝 Azure Pipelines GitHub 延伸模組或應用程式。 按照屏幕上的指示安裝應用程序。 如需詳細資訊,請參閱 存取 GitHub 存放庫

    儲存庫選擇的螢幕快照。

  5. [設定您的管線] 頁面上,選取 [入門管線]。

  6. 在 [ 檢閱管線 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 up JSON 輸出。

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

工作包含多個步驟:

  1. 首先, UsePythonVersion 任務會選取要使用的 Python 版本,如變數中 pythonVersion 所定義。

       - task: UsePythonVersion@0
          inputs:
            versionSpec: '$(pythonVersion)'
            displayName: 'Use Python $(pythonVersion)'
    
  2. 下一個步驟會使用指令碼來建立虛擬 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"
    
  3. 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
  4. 然後,檔案 .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關鍵字表示工作是以要部署的環境為目標的部署工作。 執行工作時,會自動在您的專案中建立 。environment

  • 參數 pool 會指定部署代理程式集區,並在未指定 時 name 使用預設代理程式集區。 代理程式會在變數中 vmImageName 定義的作業系統上執行,在此案例 ubuntu-latest中為 。

  - deployment: DeploymentJob
    pool:
      name: <your-pool-name>
    environment: $(environmentName)
  • deployment關鍵字表示工作是以要部署的環境為目標的部署工作。 執行工作時,會自動在您的專案中建立 。environment

  • 參數 pool 會指定部署代理程式集區,而且必須包含能夠執行管線中指定 Python 版本的代理程式。

strategy關鍵字定義部署策略。

  strategy:
    runOnce:
      deploy:
        steps:
  • runOnce關鍵詞會指定部署作業執行一次。
  • deploy關鍵字指定要在部署工作中執行的 。steps

在此階段中,執行 steps 下列工作:

  1. UsePythonVersion@0 選取要使用的 Python 版本,與 建置階段相同。
  2. AzureWebApp@1 會部署 Web 應用程式和 drop ZIP 構件。
- 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'

執行流程

您現在已準備好試用管線。

  1. 在管線編輯器中,選取 [儲存並執行]。

  2. [ 儲存並執行 ] 畫面上,視需要新增認可訊息,然後選取 [ 儲存並執行]。

    您可以在管線摘要頁面上選取階段或作業,以監視管線執行。 每個工作和階段在成功完成時都會顯示綠色核取記號。 如果發生錯誤,它們會出現在摘要或工作步驟中。

    管線執行階段摘要區段的螢幕快照。

    您可以選取 [摘要 ] 頁面右上角的垂直點,然後選取 [編輯管線],以快速返回 YAML 編輯器。

    構建報告中編輯管線註釋的螢幕截圖。

  3. 從部署作業中,選取 [部署 Azure Web 應用程式 ] 工作以顯示其輸出。

    管線階段步驟的螢幕快照。

  4. 從輸出中,選取 App Service 應用程式 URL 之後的 URL。 該應用程序應如下所示:

    在 App Service 上執行之範例應用程式的檢視螢幕快照。

注意

如果應用程式部署因為缺少相依性而失敗,則在部署期間不會處理 requirements.txt 檔案。 如果您直接在入口網站中建立 Web 應用程式,而不是使用 az webapp up 命令,則可能會發生此問題。

az webapp up命令會特別將建置動作SCM_DO_BUILD_DURING_DEPLOYMENT設定為 true。 如果您透過入口網站佈建應用程式服務,則不會自動設定此動作。

若要設定此動作:

  1. 在 Web 應用程式的入口網站頁面上,從左側導覽功能表中選取 [設定 ]。
  2. [應用程式設定 ] 索引標籤上,選取 [新增應用程式設定]。
  3. 在出現的彈出視窗中,將 [名稱] 設定為 ,將 [值] 設定SCM_DO_BUILD_DURING_DEPLOYMENT,然後選取 [true]。
  4. 選擇儲存位於設定頁面頂端。
  5. 再次執行資料處理流程。 依附元件現在應該會在部署期間安裝。

觸發流水線執行

此管線會設定為每當變更簽入程式碼存放庫時執行。 若要觸發管線執行,請提交變更至存放庫。 例如,您可以將新功能新增至應用程式,或更新應用程式的相依性。

  1. 移至應用程式的 GitHub 存放庫。
  2. 變更程式代碼,例如變更應用程式的標題。
  3. 認可變更。
  4. 移至您的管線,並確認已建立新的執行並正在執行。
  5. 執行完成時,請確認變更已部署至您的 Web 應用程式。
  6. 在 Azure 入口網站中,移至您的 Web 應用程式,然後從左側導覽功能表中選取 [部署中心 ]。
  7. 選取 [記錄] 索引標籤,並確認已列出新部署。

將 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- 開頭的資源群組。 選取 [刪除資源群組],然後依照提示進行。