共用方式為


使用 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>

在本機測試您的應用程式

在本機建置並執行應用程式,以確定其運作正常。

  1. 變更為複製的存放庫資料夾。

    cd python-sample-vscode-flask-tutorial
    
  2. 建置並執行應用程式

    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
    
  3. 若要檢視應用程式,請開啟瀏覽器視窗並移至 http://localhost:5000。 確認您看到標題 Visual Studio Flask Tutorial

  4. 當您完成時,請關閉瀏覽器視窗,並使用 Ctrl+C 停止 Flask 伺服器。

開啟 Cloud Shell

  1. 登入 Azure 入口網站:https://portal.azure.com

  2. 選取入口網站工具列上的 [Cloud Shell] 按鈕,以開啟 Azure CLI。

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

  3. Cloud Shell 會出現在瀏覽器底部。 從下拉功能表中選取 [Bash ]。

    Azure Cloud Shell 的螢幕擷取畫面。

  4. 若要提供更多可用空間,請選取 [最大化] 按鈕。

建立 Azure App 服務 Web 應用程式

在 Azure 入口網站 中,從 Cloud Shell 建立您的 Azure App 服務 Web 應用程式。

提示

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

  1. 使用下列命令複製您的存放庫,並將 取代 <repository-url> 為分支存放庫的URL。

    git clone <repository-url>
    
  2. 將目錄變更為複製的存放庫資料夾,因此 az webapp up 命令會將應用程式辨識為 Python 應用程式。

    cd python-sample-vscode-flask-tutorial
    
  3. 使用 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 命令會執行下列動作:

    您可以使用命令參數,以您自己的值覆寫默認動作。 如需詳細資訊,請參閱 az webapp up

  4. python-sample-vscode-flask-tutorial 應用程式具有startup.txt檔案,其中包含 Web 應用程式的特定啟動命令。 將 Web 應用程式 startup-file 群組態屬性設定為 startup.txt

    1. az webapp up從命令輸出複製resourcegroup值。

    2. 使用資源群組和您的應用程式名稱,輸入下列命令。

    az webapp config set --resource-group <your-resource-group> --name <your-web-app-name> --startup-file startup.txt
    

    當命令完成時,它會顯示 JSON 輸出,其中包含 Web 應用程式的所有組態設定。

  5. 若要檢視執行的應用程式,請開啟瀏覽器並移至 URL 命令輸出中顯示的 az webapp up 。 如果您看到一般頁面,請等候幾秒鐘的時間讓 App Service 啟動,然後重新整理頁面。 確認您看到標題 Visual Studio Flask Tutorial

建立 Azure DevOps 專案

建立新的 Azure DevOps 專案。

  1. 在瀏覽器中,移至 dev.azure.com 並登入。
  2. 選取您的組織。
  3. 選取 [新增專案 ] 或 [在組織中建立第一個專案時建立專案],以建立新的專案
  4. 輸入專案名稱
  5. 選取項目的可見度
  6. 選取 建立
  1. 在瀏覽器中,移至您的 Azure DevOps Server。
  2. 選取您的集合。
  3. 選取 [新增專案 ] 或 [在集合中建立第一個專案時建立專案],以建立新的專案
  4. 輸入專案名稱
  5. 選取項目的可見度
  6. 選取 建立

建立服務主體

服務主體是為了與應用程式、裝載的服務及自動化工具搭配使用來存取 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>",
  ...
}

記下 clientIdclientSecretsubscriptionIdtenantId 值。 您需要這些值,才能在下一節中建立服務連線。

建立服務連線

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

  1. 在項目頁面上,選取 [項目設定]。

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

  2. 在功能表的 [管線] 區段中,選取 [服務連線]。

  3. 選取建立服務連線

  4. 選取 [Azure Resource Manager ],然後選取 [ 下一步]。

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

  5. 選取您的驗證方法,然後選取 [ 下一步]。

  6. 在 [ 新增 Azure 服務連線 ] 對話框中,輸入所選驗證方法的特定資訊。 如需驗證方法的詳細資訊,請參閱 使用 Azure Resource Manager 服務連線連線至 Azure。

    例如,如果您使用 工作負載身分識別同盟(自動) 或服務 主體(自動) 驗證方法,請輸入必要的資訊。

    [新增服務連線] 對話框的螢幕快照。

    欄位 說明
    範圍層級 選取 [訂用帳戶]
    訂用帳戶 您的 Azure 訂用帳戶名稱。
    資源群組 包含 Web 應用程式的資源群組名稱。
    服務連線名稱 連接的描述性名稱。
    授與所有管線的訪問許可權 選取此選項可授與所有管線的存取權。
  7. 選取儲存

新的聯機會出現在 [ 服務連線 ] 清單中,並準備好在 Azure Pipeline 中使用。

  1. 在項目頁面上,選取 [項目設定]。

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

  2. 在功能表的 [管線] 區段中,選取 [服務連線]。

  3. 選取建立服務連線

  4. 選取 [Azure Resource Manager ],然後選取 [ 下一步]。

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

  5. 在 [新增 Azure 服務連線] 上,選取 [服務主體][手動],然後選取 [下一步]

  6. 在下一個對話框中,填寫必要資訊。

    [新增服務連線] 對話框的螢幕快照。

    欄位 說明
    環境 選取 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 物件的值。
  7. 選取 [ 驗證 ] 以確認連線。

  8. 輸入服務連線名稱

  9. 確定 已選取 [授與所有管線的訪問許可權 ]。

  10. 選取 [確認並儲存]

新的聯機會出現在 [ 服務連線 ] 清單中,並準備好讓 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.completex64.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 服務。 若要瞭解管線概念,請觀看:

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

    專案儀錶板上 [管線] 選取項目的螢幕快照。

  2. 選取建立管線

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

  3. 在 [ 在哪裡是您的程序代碼 ] 對話框中,選取 [GitHub]。 系統可能會提示您登入 GitHub。

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

  4. 在 [ 選取存放庫 ] 畫面上,選取分岔範例存放庫。

    存放庫選取項目的螢幕快照。

  5. 系統可能會提示您再次輸入 GitHub 密碼作為確認。

  6. 如果未在 GitHub 上安裝 Azure Pipelines 擴充功能,GitHub 會提示您安裝 Azure Pipelines 擴充功能。

    在 GitHub 上安裝 Azure Pipelines 擴充功能。

    在此頁面上,向下捲動至 [ 存放庫存取 ] 區段,選擇是要在所有存放庫上安裝擴充功能,還是只選取選取的存放庫,然後選取 [ 核准並安裝]。

    GitHub 上核准和安裝 Azure Pipelines 延伸模組的螢幕快照。

  7. 在 [ 設定管線] 對話框中,選取 [Python 至 Azure 上的 Linux Web 應用程式]。

  8. 選取您的 Azure 訂用帳戶,然後選取 [ 繼續]。

  9. 如果您使用使用者名稱和密碼進行驗證,瀏覽器隨即開啟,讓您登入Microsoft帳戶。

  10. 從下拉式清單中選取您的 Web 應用程式名稱,然後選取 [ 驗證並設定]。

Azure Pipelines 會 建立azure-pipelines.yml 檔案,並將其顯示在 YAML 管線編輯器中。 管線檔案會將 CI/CD 管線定義為一系列階段、作業和步驟,其中每個步驟都包含不同工作腳本的詳細數據。 查看管線以了解其作用。 請確定所有預設輸入都適合您的程式代碼。

  1. 在導覽功能表上,選取 [ 管線]。

    專案儀錶板上 [管線] 選取項目的螢幕快照。

  2. 選取建立管線

    [新增管線] 按鈕的螢幕快照。

  3. 在 [ 在哪裡是您的程序代碼 ] 對話框中,選取 [GitHub Enterprise Server]。 系統可能會提示您登入 GitHub。

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

  4. 在 [ 選取存放庫 ] 索引卷標上,選取分叉範例存放庫。

    存放庫選取項目的螢幕快照。

  5. 系統可能會提示您再次輸入 GitHub 密碼作為確認。

  6. 如果未在 GitHub 上安裝 Azure Pipelines 擴充功能,GitHub 會提示您安裝 Azure Pipelines 擴充功能。

    GitHub 上 Azure Pipelines 延伸模組的螢幕快照。

    在此頁面上,向下捲動至 [ 存放庫存取 ] 區段,選擇是要在所有存放庫上安裝擴充功能,還是只選取選取的存放庫,然後選取 [ 核准並安裝]。

    GitHub 上核准和安裝 Azure Pipelines 延伸模組的螢幕快照。

  7. 在 [ 設定管線] 對話框中,選取 [ 入門管線]。

  8. 使用下列程式代碼取代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'
    
    
  9. 以您自己的值取代下列佔位元:

    預留位置 說明
    <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

工作包含多個步驟:

  1. UsePythonVersion 工作會選取要使用的 Python 版本。 版本定義於變數中 pythonVersion

       - task: UsePythonVersion@0
          inputs:
            versionSpec: '$(pythonVersion)'
            displayName: 'Use Python $(pythonVersion)'
    
  2. 此步驟會使用腳本來建立虛擬 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"
    
  3. 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管線中的 為:

  1. 使用UsePythonVersion工作來指定要在代理程式上使用的 Python 版本。 版本定義於變數中 pythonVersion

     - task: UsePythonVersion@0
       inputs:
         versionSpec: '$(pythonVersion)'
       displayName: 'Use Python version'
    
  2. 使用 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管線中的 為:

  1. 使用UsePythonVersion工作來指定要在代理程式上使用的 Python 版本。 版本定義於變數中 pythonVersion

     - task: UsePythonVersion@0
       inputs:
         versionSpec: '$(pythonVersion)'
       displayName: 'Use Python version'
    
  2. 使用 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

執行管線

您現在已準備好試試看!

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

  2. 在 [ 儲存並執行 ] 對話框中,新增認可訊息,然後選取 [ 儲存並執行]。

    您可以選取管線執行摘要中的 [階段] 或 [作業] 來監看管線執行。

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

    每個階段和作業旁邊都有綠色複選標記,因為它成功完成。 如果發生錯誤,它們會顯示在摘要或作業步驟中。

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

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

    從組建報表編輯管線批注的螢幕快照。

  3. 從部署作業中,選取 [部署 Azure Web 應用程式 ] 工作以顯示其輸出。 若要流覽已部署的網站,請按住 Ctrl ,然後在 之後 App Service Application URL選取 URL。

    如果您使用範例應用程式,應用程式應該會顯示如下:

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

重要

如果您的應用程式因為缺少相依性而失敗,則部署期間未處理您的 requirements.txt 檔案。 如果您直接在入口網站上建立 Web 應用程式,而不是使用如本文所示的命令, az webapp up 就會發生此行為。

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

下列步驟會設定動作:

  1. 開啟 Azure 入口網站,選取您的 App Service,然後選取 [設定]。
  2. 在 [ 應用程式設定] 索引標籤底下,選取 [ 新增應用程式設定]。
  3. 在出現的彈出視窗中,將 [名稱] 設定為 ,將 [值] 設定SCM_DO_BUILD_DURING_DEPLOYMENTtrue,然後選取 [確定]。
  4. 選取 [設定] 頁面頂端的 [儲存]
  5. 再次執行管線。 您的相依性應該在部署期間安裝。

觸發管線執行

若要觸發管線執行,請將變更認可至存放庫。 例如,您可以將新功能新增至應用程式,或更新應用程式的相依性。

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

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 開頭的資源群組,選取 [ 刪除資源群組],然後遵循提示。

下一步