共用方式為


部署至環境中的Linux VM

Azure DevOps 服務 |Azure DevOps Server |Azure DevOps Server 2022 |Azure DevOps Server 2020

您可以將虛擬機器新增為 Azure Pipelines 環境中 的資源,並將它們鎖定為部署目標。 針對持續整合和持續部署(CI/CD),環境的部署歷程記錄可為每個 VM 提供可追溯性,使其能追溯至觸發提交。

本文說明如何設定 Azure DevOps 管線,以部署至環境中的多個 Linux 虛擬機器 (VM) 資源 。 這些指示會建置和部署 JavaScript 或 Java 應用程式,但您可以針對發佈 Web 部署套件的任何應用程式進行調整。

如需部署工作所針對的環境和資源的詳細資訊,請參閱 jobs.deployment.environment YAML 結構描述定義。 如需部署工作的相關資訊,請參閱 jobs.deployment 定義。

必要條件

此外,對於 JavaScript 或 Node.js 應用程式:

重要

  • 若要部署應用程式,目標環境 VM 資源必須安裝並設定所有必要的軟體、相依性、權限和登入。
  • 若要使用 GitHub 原始程式碼,您需要 GitHub 服務連線。 GitHub 也可能會提示您登入、安裝 Azure Pipelines GitHub 應用程式,或授權 Azure Pipelines。 若要完成每個程序,請依照螢幕上的指示進行操作。 如需詳細資訊,請參閱 存取 GitHub 存放庫

建立環境並新增 Linux VM

在您的 Azure Pipelines 專案中,請遵循 建立環境並新增 VM 中的指示,將 Linux VM 新增為環境資源。

在每個 VM 上執行複製的代理程式註冊指令碼,以在環境中註冊它。 您也可以回應互動式提示,將標籤指派給個別虛擬機器。

建立並執行組建流程

建立 CI 流程,每當程式碼庫中的 main 分支有新的提交時,都會建置和部署您的應用程式。

建立 YAML 管線

  1. 在您的 Azure DevOps 專案中,選取 [管線>] [新增管線] 或 [建立管線],然後選取 [GitHub] 作為原始程式碼的位置。
  2. 在 [ 選取存放庫 ] 畫面上,選取分支範例存放庫。
  3. 在 [設定您的管線] 畫面上,選取 [入門管線]。
  4. 在 [ 檢閱管線 YAML ] 畫面上,視您的執行階段而定,將產生的入門程式碼取代為下列程式碼。

新增建置作業

作為一個任務,Build 會執行工作以建置和測試您的專案,然後將建置結果上傳至某個 drop 位置。 此作業會在管線 pool中指定的組建代理程式上執行,而不是在您的 Linux 環境 VM 上執行。

下列管線會使用 npm 建置和測試您的 Node.js 專案,然後封裝輸出並將其上傳至放置位置。

trigger:
- main

pool:
  vmImage: ubuntu-latest

jobs:  
- job: Build
  displayName: Build
  steps:
  - task: UseNode@1
    inputs:
      version: '16.x'
    displayName: 'Install Node.js'
  - script: |
      npm install
      npm run build --if-present
      npm run test --if-present
    displayName: 'npm install, build and test'
  - task: ArchiveFiles@2
    displayName: 'Archive files'
    inputs:
      rootFolderOrFile: '$(System.DefaultWorkingDirectory)'
      includeRootFolder: false
      archiveType: tar
      tarCompression: gz
      archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).gz
      replaceExistingArchive: true
  - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).gz
    artifact: drop

如需詳細資訊,請檢閱 使用 gulp 建置 Node.js 應用程式中的組建步驟。

執行流程

若要將 azure-pipelines.yml 檔案儲存至存放庫並啟動 CI/CD 管線,請選取 [儲存並執行],然後選取 [儲存並再次執行]。

當管線完成時,請檢視作業 摘要頁面 ,以確認建置作業已成功執行,且 1 個已發佈 的成品出現在 [相關] 底下。

新增並執行部署作業

部署工作preDeploydeployrouteTrafficpostRouteTraffic執行一次生命周期掛鉤,然後執行 on: successon: failure。 如果您部署至環境 VM,則階段 preDeploy 會在建置代理程式上執行,而不是在環境 VM 上執行。 所有其他步驟都會在環境中已註冊的 VM 上執行。

  1. 選擇性 preDeploy 步驟會在部署之前執行。 您可以使用此步驟進行協調流程、VM 和成品準備,以及性能檢查。
  2. deploy 步驟會將部署物件部署至目標環境 VM。
  3. 選用 routeTraffic 步驟可以套用流量切換。
  4. 選用的 postRouteTraffic 步驟可以執行健康檢查和通知。
  5. 自訂 on.failureon.success 步驟可以提供通知或復原。

將作業部署到環境 resourceType: VirtualMachine 需要環境中的虛擬機器能夠執行所有管線任務,例如 Bash 或 Azure CLI。 您可以使用此 preDeploy 步驟在目標 VM 上安裝必要的軟體和權限。

例如,如果部署步驟使用 Azure CLI,代理程式 VM 必須已安裝 Azure CLI,並在代理程式使用者的 PATH 上使用。 代理程式使用者必須具有執行 CLI 的許可權,而且必須向 Azure 進行驗證。 您可能需要將代理程式使用者新增至 sudoers,或設定環境變數以自動化安裝。

您可以使用 preDeploy 腳本在目標 VM 上安裝 Azure CLI。 若要向 Azure 進行驗證,您可以執行 az login;而針對自動化,您需要定義一個服務主體,然後在步驟中執行 az login --service-principalpreDeploy

新增部署任務

下列範例部署作業會在 Build 作業成功完成時啟動。 若要將任務新增至管線:

  1. 選取 [摘要] 頁面右上角的 [更多動作] 圖示,選取 [編輯管線],然後將下列程式碼新增至管線結尾。 將 <environment-name> 取代為您建立的環境名稱。

    或者,您可以使用 tags 參數,並指定您為 VM 定義的 <VMtag>,從環境中選擇特定的 VM 來接收部署。

    - deployment: VMDeploy
      displayName: Web deploy
      dependsOn: Build
      condition: succeeded()
      environment:
        name: <environment-name>
        resourceType: VirtualMachine
        tags: <VMtag> # VMs to deploy to
    
  2. 新增 strategydeployment 作業。 runOnce 部署策略是最簡單的,如果您未指定 strategy,則預設會執行。 此策略會在環境中的每個 VM 上執行一次部署步驟,沒有任何平行處理原則或流量管理。

      strategy:
         runOnce:
           deploy:
              steps:
              - script: echo my first deployment
    
  3. 新增部署作業之後,請選取 [驗證並儲存],然後選取 [儲存]、選取 [執行],然後再次選取 [執行]。 每次執行此作業時,都會針對環境進行部署歷程記錄。

    注意

    第一次執行使用環境的管線時,您必須授與管線所有執行的許可權,才能存取代理程式集區和環境。 選取管線執行摘要畫面上作業旁的 [等候] 符號,然後選取 [允許] 以授與必要的許可權。

輪流部署策略

您可以使用rolling而不是runOnce進行部署策略。 滾動部署策略可以協調平行處理原則、健康情況檢查和流量路由。 雖然策略一次在單一 VM 上執行,但 runOnce 輪流部署可以在最多五個目標 VM 的 輪流集 上平行執行,具體取決於設定 maxParallel

maxParallel 參數會設定必須保持可用的 VM 數目或百分比,以確保應用程式可以處理要求,並減少部署期間的整體停機時間。 此參數也會決定部署的成功和失敗條件。

如需滾動部署策略的詳細資訊,請參閱 jobs.deployment.strategy.rolling 綱目定義。

部署作業範例

部署至 VM 資源需要 VM 安裝和設定所有必要的應用程式、相依性和權限。 您必須手動預先安裝這些需求,否則管線必須安裝或實作這些需求。

將 Java 應用程式部署至 VM 資源更容易實作,因為它是獨立的。 Java 虛擬機器 (JVM) 通常預先安裝在 VM 代理程式上,您無需擔心應用程式相依性、權限或套件管理。 您只需下載 JAR 文件,然後使用 java -jar運行它。

Node.js 應用程式需要 Node.js 以及可能需要的 npm 相依性,還有在每個代理程式 VM 上安裝和設定的像 systemd 這樣的服務管理員。 若要自動化,管線部署指令碼必須是非互動式的,而且能夠重新啟動和管理應用程式的服務。

JavaScript 應用程式的下列 YAML rolling 部署工作依賴於 Build 階段成功完成。 部署作業假設每個代理程式 VM 上已預先安裝或預先設定下列需求。 若要完全自動化,您可以在 VM 上安裝和設定這些應用程式和服務,做為管線的一部分。

  • Node.js 已安裝 16.x,並且 npm 可在建置代理程式的 PATH 上使用。
  • Systemd 與一個 systemd 服務檔案,用於設定啟動 Node.js 應用程式的服務,例如 /etc/systemd/system/pipelines-javascript.service
  • 代理程式使用者的必要命令的無密碼 sudo,在 NOPASSWD:/etc/sudoers 中設定。
  • 將代理程式使用者的許可權寫入 /opt/pipelines-javascript 或其他部署目標。

小提示

針對大部分的 Node.js 應用程式,請考慮部署至 Azure App Service,或使用由 Microsoft 託管代理程式的一般管線作業,而不是使用部署作業。 此方法更簡單,可避免管理 VM 環境的作業額外負荷。 部署至特定 VM 資源最適合需要直接控制 VM 伺服器、進階協調流程或舊版基礎結構的案例。

- stage: Deploy
  displayName: Rolling Deploy to VMs
  dependsOn: Build
  condition: succeeded()
  jobs:
  - deployment: RollingDeploy
    displayName: Rolling deploy to Ubuntu VMs
    environment:
      name: <environment-name>
      resourceType: VirtualMachine
    strategy:
      rolling:
        maxParallel: 1   #or 2 for parallel. For percentages, use x%
        preDeploy:
          steps:
          - download: current
            artifact: drop
          - script: echo "Pre-deploy on $(hostname)"
        deploy:
          steps:
          - script: |
              echo "Unpacking Node.js app on $(hostname)"
              sudo mkdir -p /opt/pipelines-javascript
              sudo tar -xzf $(Pipeline.Workspace)/drop/$(Build.BuildId).tar.gz -C /opt/pipelines-javascript --strip-components=1
              cd /opt/pipelines-javascript
              echo "Installing production dependencies"
              sudo npm ci --only=production
              echo "Restarting Node.js service"
              sudo systemctl restart pipelines-javascript
            displayName: 'Extract, install, and restart Node.js service'
        routeTraffic:
          steps:
          - script: echo "Routing traffic on $(hostname)"
        postRouteTraffic:
          steps:
          - script: echo "Post-route health check on $(hostname)"
        on:
          failure:
            steps:
            - script: echo "Deployment failed on $(hostname)"
          success:
            steps:
            - script: echo "Deployment succeeded on $(hostname)"

存取環境中的管線可追蹤性

環境 [部署] 索引標籤提供工作認可和專案的完整追溯性,並提供環境的跨管道部署歷史記錄。

部署檢視的螢幕快照。