使用 Azure Pipelines 來建置並部署 HPC 解決方案

Azure DevOps 工具可以自動化建置與測試 Azure Batch 高效能運算(HPC)解決方案。 Azure Pipelines 提供現代化的持續整合(CI)與持續部署(CD)流程,用於建置、部署、測試及監控軟體。 這些流程加速了軟體交付,讓你能專注於程式碼,而非支援基礎設施與營運。

本文說明如何利用 Azure Pipelines 搭配 Azure Resource Manager 範本(ARM 範本)來設定 CI/CD 流程,並在 Azure Batch 上部署 HPC 解決方案。 範例中建立一個建置與發布流程,以部署 Azure Batch 基礎架構並發布應用程式套件。 下圖顯示了一般的部署流程,假設程式碼是在本地開發:

展示管線部署流程的圖表。

先決條件

要依照本文步驟操作,你需要:

準備解決方案

本文範例使用了多種 ARM 範本及現有的開源影片處理軟體 FFmpeg。 你可以複製或下載這些資源,然後推送到你的 Azure Repos 倉庫。

Important

此範例是在基於 Windows 的批次節點上部署 Windows 軟體。 Azure Pipelines、ARM 範本和批次也完全支援 Linux 軟體和節點。

了解 ARM 範本

三個能力範本,類似單位或模組,實作特定功能。 端對端解決方案範本接著部署底層的能力範本。 這種 連結範本 結構允許每個能力範本在各解決方案間個別測試並重複使用。

使用ARM範本展示連結模板結構的圖解。

欲了解範本的詳細資訊,請參閱 Microsoft 的 Resource Manager 範本參考指南。批次資源類型

儲存帳號範本

將以下程式碼儲存為名為 storageAccount.json的檔案。 此範本定義了一個 Azure 儲存體 帳號,該帳號是部署應用程式到 Batch 帳號所必需的。

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "accountName": {
            "type": "string",
            "metadata": {
                 "description": "Name of the Azure Storage Account"
             }
         }
    },
    "variables": {},
    "resources": [
        {
            "type": "Microsoft.Storage/storageAccounts",
            "name": "[parameters('accountName')]",
            "sku": {
                "name": "Standard_LRS"
            },
            "apiVersion": "2018-02-01",
            "location": "[resourceGroup().location]",
            "properties": {}
        }
    ],
    "outputs": {
        "blobEndpoint": {
          "type": "string",
          "value": "[reference(resourceId('Microsoft.Storage/storageAccounts', parameters('accountName'))).primaryEndpoints.blob]"
        },
        "resourceId": {
          "type": "string",
          "value": "[resourceId('Microsoft.Storage/storageAccounts', parameters('accountName'))]"
        }
    }
}

批次帳戶範本

將以下程式碼儲存為名為 batchAccount.json的檔案。 此範本定義了 批次帳號。 批次帳號作為跨節點 執行應用程式的平台。

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "batchAccountName": {
           "type": "string",
           "metadata": {
                "description": "Name of the Azure Batch Account"
            }
        },
        "storageAccountId": {
           "type": "string",
           "metadata": {
                "description": "ID of the Azure Storage Account"
            }
        }
    },
    "variables": {},
    "resources": [
        {
            "name": "[parameters('batchAccountName')]",
            "type": "Microsoft.Batch/batchAccounts",
            "apiVersion": "2017-09-01",
            "location": "[resourceGroup().location]",
            "properties": {
              "poolAllocationMode": "BatchService",
              "autoStorage": {
                  "storageAccountId": "[parameters('storageAccountId')]"
              }
            }
          }
    ],
    "outputs": {}
}

批次池範本

將以下程式碼儲存為名為 batchAccountPool.json的檔案。 此範本會建立節點池及批次帳號中的節點。

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "batchAccountName": {
           "type": "string",
           "metadata": {
                "description": "Name of the Azure Batch Account"
           }
        },
        "batchAccountPoolName": {
            "type": "string",
            "metadata": {
                 "description": "Name of the Azure Batch Account Pool"
             }
         }
    },
    "variables": {},
    "resources": [
        {
            "name": "[concat(parameters('batchAccountName'),'/', parameters('batchAccountPoolName'))]",
            "type": "Microsoft.Batch/batchAccounts/pools",
            "apiVersion": "2017-09-01",
            "properties": {
                "deploymentConfiguration": {
                    "virtualMachineConfiguration": {
                        "imageReference": {
                            "publisher": "MicrosoftWindowsServer",
                            "offer": "WindowsServer",
                            "sku": "2022-datacenter",
                            "version": "latest"
                        },
                        "nodeAgentSkuId": "batch.node.windows amd64"
                    }
                },
                "vmSize": "Standard_D2s_v3"
            }
          }
    ],
    "outputs": {}
}

編排器範本

將以下程式碼儲存為名為 deployment.json的檔案。 這個最終範本作為編排器,部署三個底層能力範本。

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "StorageContainerUri": {
           "type": "string",
           "metadata": {
                "description": "URI of the Blob Storage Container containing the Azure Resource Manager templates"
            }
        },
        "StorageContainerSasToken": {
           "type": "string",
           "metadata": {
                "description": "The SAS token of the container containing the Azure Resource Manager templates"
            }
        },
        "applicationStorageAccountName": {
            "type": "string",
            "metadata": {
                 "description": "Name of the Azure Storage Account"
            }
         },
        "batchAccountName": {
            "type": "string",
            "metadata": {
                 "description": "Name of the Azure Batch Account"
            }
         },
         "batchAccountPoolName": {
             "type": "string",
             "metadata": {
                  "description": "Name of the Azure Batch Account Pool"
              }
          }
    },
    "variables": {},
    "resources": [
        {
            "apiVersion": "2017-05-10",
            "name": "storageAccountDeployment",
            "type": "Microsoft.Resources/deployments",
            "properties": {
                "mode": "Incremental",
                "templateLink": {
                  "uri": "[concat(parameters('StorageContainerUri'), 'arm-templates/storageAccount.json', parameters('StorageContainerSasToken'))]",
                  "contentVersion": "1.0.0.0"
                },
                "parameters": {
                    "accountName": {"value": "[parameters('applicationStorageAccountName')]"}
                }
            }
        },
        {
            "apiVersion": "2017-05-10",
            "name": "batchAccountDeployment",
            "type": "Microsoft.Resources/deployments",
            "dependsOn": [
                "storageAccountDeployment"
            ],
            "properties": {
                "mode": "Incremental",
                "templateLink": {
                  "uri": "[concat(parameters('StorageContainerUri'), 'arm-templates/batchAccount.json', parameters('StorageContainerSasToken'))]",
                  "contentVersion": "1.0.0.0"
                },
                "parameters": {
                    "batchAccountName": {"value": "[parameters('batchAccountName')]"},
                    "storageAccountId": {"value": "[reference('storageAccountDeployment').outputs.resourceId.value]"}
                }
            }
        },
        {
            "apiVersion": "2017-05-10",
            "name": "poolDeployment",
            "type": "Microsoft.Resources/deployments",
            "dependsOn": [
                "batchAccountDeployment"
            ],
            "properties": {
                "mode": "Incremental",
                "templateLink": {
                  "uri": "[concat(parameters('StorageContainerUri'), 'arm-templates/batchAccountPool.json', parameters('StorageContainerSasToken'))]",
                  "contentVersion": "1.0.0.0"
                },
                "parameters": {
                    "batchAccountName": {"value": "[parameters('batchAccountName')]"},
                    "batchAccountPoolName": {"value": "[parameters('batchAccountPoolName')]"}
                }
            }
        }
    ],
    "outputs": {}
}

建立你的資料庫

將 ARM 範本、FFmpeg 應用程式和 YAML 建置定義檔上傳到你的 Azure Repos 倉庫。

  1. 將四個 ARM 範本上傳到你倉庫中的 arm-templates 資料夾。

  2. 應用程式套件請下載並解壓 Windows 64 位元版本的 FFmpeg 4.3.1,然後上傳到你儲存庫中的 hpc-application 資料夾。

  3. 關於建置定義,將以下定義儲存為名為 hpc-app.build.yml 的檔案,並上傳到你儲存庫中的 pipelines 資料夾。

    # To publish an application into Batch, you need to
    # first zip the file, and then publish an artifact, so
    # you can take the necessary steps in your release pipeline.
    steps:
    # First, zip up the files required in the Batch account.
    # For this instance, those are the ffmpeg files.
    - task: ArchiveFiles@2
      displayName: 'Archive applications'
      inputs:
        rootFolderOrFile: hpc-application
        includeRootFolder: false
        archiveFile: '$(Build.ArtifactStagingDirectory)/package/$(Build.BuildId).zip'
    # Publish the zip file, so you can use it as part
    # of your Release pipeline later.
    - task: PublishPipelineArtifact@0
      inputs:
        artifactName: 'hpc-application'
        targetPath: '$(Build.ArtifactStagingDirectory)/package'
    

當你完成儲存庫設置後,資料夾結構應該包含以下主要區塊:

  • 一個包含 ARM 範本的 arm-templates 資料夾。
  • 一個包含 ffmpeg 的 hpc-application 資料夾。
  • 一個包含 YAML 建置管線定義檔的 pipelines 資料夾。

儲存庫結構的截圖。

備註

這個範例程式碼庫結構展示了你可以在同一個儲存庫中儲存應用程式、基礎設施和管線程式碼。

建立 Azure 管線

在你建立完原始碼倉庫後,使用 Azure Pipelines 來實作你的應用程式的建置、測試和部署流程。 在這個流程階段,通常會執行測試來驗證程式碼並建置軟體的各個部分。 測試的數量和類型,以及你執行的其他任務,取決於你整體的建置與發布策略。

建立建置管線

在這個部分,你會建立一個 YAML 建置流程 ,以配合在批次帳號中執行的 ffmpeg 軟體。

  1. 在你的 Azure DevOps 專案中,從左側導覽選擇「管線」,然後選擇「新管線」。

  2. 你的程式碼在哪裡 畫面,選擇 Azure Repos Git

    新管線畫面的截圖。

  3. 在 [選取存放庫 畫面上,選取您的存放庫。

    備註

    你也可以用視覺設計器建立建置流程。 在 新管線 頁面,選擇 使用經典編輯器。 你可以在視覺設計器中使用 YAML 範本。 欲了解更多資訊,請參閱 定義您的經典流程

  4. 「設定你的管線」畫面中,選擇「現有的 Azure Pipelines YAML 檔案」。

  5. 在「 選擇現有 YAML 檔案 」畫面中,從你的儲存庫中選擇 hpc-app.build.yml 檔案,然後選擇 繼續

  6. 「檢閱您的管線 YAML」 畫面上,檢閱建置組態,然後選取 執行,或者選取 執行 旁的下拉箭號,然後選取 儲存。 此範本可啟用持續整合,因此當存放庫中的新提交符合建置中設定的條件時,系統會自動觸發建置。

    現有建置流程的截圖。

  7. 你可以查看即時建置進度更新。 要查看建置結果,請在 Azure Pipelines 中從建置定義中選擇適當的執行。

    Azure Pipelines 中建置即時輸出的螢幕擷取畫面。

備註

如果你用客戶端應用程式來執行 HPC 解決方案,你需要為該應用程式建立獨立的建置定義。 有關操作指南,請參閱 Azure Pipelines 文件。

建立發行管線

你使用 Azure Pipelines Release pipeline 來部署你的應用程式和底層基礎設施。 發行流程啟用 CD 並自動化您的發佈流程。 部署您的應用程式及底層基礎設施有幾個步驟。

此解決方案 所連結的範本 必須能從公開的 HTTP 或 HTTPS 端點存取。 這個端點可以是 GitHub 倉庫、Azure Blob 儲存體 帳號,或其他儲存地點。 為確保上傳的範本文稿安全,請將其保存為私密模式,但可使用某種共享存取簽章(SAS)令牌存取。

以下範例示範如何利用 Azure 儲存體 blob 中的範本部署基礎架構與應用程式。

建立管線

  1. 在你的 Azure DevOps 專案中,選擇左側導覽中的 Pipelines>Releases

  2. 在下一個畫面上,選取 新增>新增發行管線

  3. 「選擇範本 」畫面,選擇 「空工作」,然後關閉 「階段 」畫面。

  4. 在頁面頂端選擇新版本管線,並將管線重新命名為與你的管線相關的名稱,例如部署 Azure Batch + Pool

    初始發行流程的截圖。

  5. Artifacts 區塊,選擇 新增

  6. 「新增工件 」畫面,選擇 建置 ,然後選擇建置管線,取得 HPC 應用程式的輸出。

    備註

    你可以建立 一個 Source 別名 ,或接受預設值。 請注意 Source 別名 值,因為你需要它來建立 release 定義中的任務。

    顯示建置管線中到 hpc-application 套件之成品連結的螢幕截圖

  7. 選取 ,然後新增

  8. 在管線頁面上,選取成品旁的新增,以建立到另一個成品的連結,也就是您的 Azure Repos 存放庫。 此連結是存取您儲存庫中 ARM 範本的必要條件。 ARM 範本不需要編譯,所以你不需要把它們推送到建置流程。

    備註

    再次注意稍後要使用的 來源別名 值。

    顯示到 Azure Repos 存放庫之成品連結的螢幕截圖。

  9. 選擇 變數 標籤。在你的管線中建立以下變數,這樣你就不用在多個任務中重複輸入相同的資訊。

    Name 價值
    applicationStorageAccountName 儲存帳號名稱,用來存放 HPC 應用程式的二進位檔。
    batchAccountApplicationName 批次帳號中的應用程式名稱。
    batchAccountName 批次帳號的名稱。
    batchAccountPoolName 用於執行處理作業的虛擬機器(VM)集區名稱。
    batchApplicationId 批次申請的唯一識別碼,格式如下:
    /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>^
    /providers/Microsoft.Batch/batchAccounts/<batchAccountName>^
    /applications/<batchAccountApplicationName>

    將佔位符換<subscriptionId>成你的 Azure 訂閱 ID,其他佔位符則換成你為清單中其他變數設定的值。
    batchApplicationVersion 你批次應用程式的語意版本,這裡指 的是 4.3.1
    位置 欲部署資源的 Azure 區域。
    resourceGroupName 用來部署資源的資源群組名稱。
    儲存帳戶名稱 儲存帳號名稱,用來存放連結的 ARM 範本。
    StorageContainerSasToken $(<referenceName>.StorageContainerSasToken)。 將<referenceName預留位置替換成您在下列 Azure 檔案複製步驟的輸出變數區段中設定的參考名稱值。
    StorageContainerUri $(<referenceName>.StorageContainerUri)。 將<referenceName>預留位置替換成您在下列 Azure 檔案複製步驟的輸出變數區段中設定的參考名稱值。

    顯示為 Azure Pipelines 發行所設定之變數的螢幕擷取畫面。

  10. 選擇 「任務 」標籤,然後選擇 「代理工作」。

  11. 代理職缺畫面,在代理池下,選擇 Azure Pipelines

  12. 代理規範中,選擇 windows-latest

    截圖顯示代理工作設定。

新增工作

設計六項任務以:

  • 下載壓縮好的 ffmpeg 檔案。
  • 部署一個儲存帳號來承載巢狀的 ARM 範本。
  • 把 ARM 範本複製到儲存帳號。
  • 部署 Batch 帳戶及所需的相依元件。
  • 在批次帳號建立一個應用程式。
  • 將申請套件上傳到批次帳號。

針對以下步驟所指定的每個新工作:

  1. 在左側窗格中選擇「+」旁邊的符號。

  2. 在右側欄格搜尋並選擇指定的任務。

  3. 新增或選擇設定任務的屬性。

  4. 選取 ,然後新增

    截圖顯示將 HPC 應用程式釋出到 Azure Batch 時所使用的任務。

請依照下列方式建立任務:

  1. 選擇 下載管線工件 任務,並設定以下屬性:

    • 顯示名稱:輸入 Download ApplicationPackage to Agent
    • 工件名稱:輸入 hpc-application
    • 目的地目錄:輸入 $(System.DefaultWorkingDirectory)
  2. 建立一個 Azure 儲存體 帳號來儲存你的 ARM 範本。 你可以使用現有的儲存帳號,但為了支援這個獨立範例和內容隔離,請建立一個專用的儲存帳號。

    選擇 ARM 範本部署:資源群組範圍 任務,並設定以下屬性:

    • 顯示名稱: 輸入 用於 ARM 範本的部署儲存體帳戶
    • Azure Resource Manager 連線:選取適當的 Azure 訂用帳戶。
    • 訂閱方式:請選擇適當的 Azure 訂閱。
    • 操作:選擇 建立或更新資源群組
    • 資源組:輸入 $(resourceGroupName)
    • 地點:輸入 $(location)
    • 範本:輸入 $(System.ArtifactsDirectory)/<AzureRepoArtifactSourceAlias>/arm-templates/storageAccount.json。 將<AzureRepoArtifactSourceAlias>預留位置替換成您之前提到的存放庫來源別名。
    • 覆寫樣本參數:輸入 -accountName $(storageAccountName)
  3. 從來源控制項將成品上傳到儲存體帳戶。 這個 Azure 檔案複製任務的一部分會將儲存帳號容器的 URI 和 SAS 令牌輸出成變數,方便後續步驟重複使用。

    選擇 Azure 檔案複製任務,並設定以下屬性:

    • 顯示名稱: 輸入 AzureBlob File Copy
    • 資料來源: 進入 $(System.ArtifactsDirectory)/<AzureRepoArtifactSourceAlias>/arm-templates/。 將<AzureRepoArtifactSourceAlias>預留位置替換成您之前提到的存放庫來源別名。
    • Azure 訂閱:選擇適當的 Azure 訂閱。
    • Destination Type: Select Azure Blob.
    • RM 儲存帳戶:輸入 $(storageAccountName)
    • 容器名稱:輸入 範本
    • 參考名稱:展開 輸出變數,然後輸入 ffmpeg

    備註

    如果此步驟失敗,請確認您的 Azure DevOps 組織在儲存體帳戶中具有 Storage Blob Contributor 角色。

  4. 部署協調器 ARM 範本,以建立 Batch 帳戶和集區。 此範本包含儲存帳戶容器 URI 與 SAS 代幣的參數。 ARM 範本中所需的變數存放於版本定義的變數區塊,並由 AzureBlob 檔案複製任務設定。

    選擇 ARM 範本部署:資源群組範圍 任務,並設定以下屬性:

    • 顯示名稱:Enter Deploy Azure Batch
    • Azure Resource Manager 連線: 選取適當的 Azure 訂用帳戶。
    • 訂閱方式:請選擇適當的 Azure 訂閱。
    • 操作:選擇 建立或更新資源群組
    • 資源組:輸入 $(resourceGroupName)
    • 地點:輸入 $(location)
    • 範本位置:選擇 檔案的網址
    • 範本連結: 進入 $(StorageContainerUri)arm-templates/deployment.json$(StorageContainerSasToken)
    • 覆寫樣本參數:輸入 -StorageContainerUri $(StorageContainerUri) -StorageContainerSasToken $(StorageContainerSasToken) -applicationStorageAccountName $(applicationStorageAccountName) -batchAccountName $(batchAccountName) -batchAccountPoolName $(batchAccountPoolName)

    常見做法是使用 Azure Key Vault 任務。 如果連接到你 Azure 訂閱的服務主體有適當的存取政策設定,它可以從 金鑰保存庫 下載秘密,並作為你的管線中的變數使用。 秘密的名稱會與其對應的值一同設定。 例如,你可以在釋出定義中引用 sshPassword 的秘密,並標註 $(sshPassword)。

  5. 呼叫 Azure CLI 以 Azure Batch 建立應用程式。

    選擇 Azure CLI 任務,並設定以下屬性:

    • 顯示名稱:輸入 Create application in Azure Batch account
    • Azure Resource Manager 連線: 選取適當的 Azure 訂用帳戶。
    • 腳本類型:選擇 PowerShell 核心
    • 腳本位置:選擇 內嵌腳本
    • 內嵌腳本:輸入 az batch application create --application-name $(batchAccountApplicationName) --name $(batchAccountName) --resource-group $(resourceGroupName)
  6. 呼叫 Azure CLI 將相關套件上傳到應用程式,這裡指的是 ffmpeg 檔案。

    選擇 Azure CLI 任務,並設定以下屬性:

    • 顯示名稱:輸入 將套件上傳至 Azure Batch 帳戶
    • Azure Resource Manager 連線: 選取適當的 Azure 訂用帳戶。
    • 腳本類型:選擇 PowerShell 核心
    • 腳本位置:選擇 內嵌腳本
    • 內嵌腳本:輸入 az batch application package create --application-name $(batchAccountApplicationName) --name $(batchAccountName) --resource-group $(resourceGroupName) --version $(batchApplicationVersion) --package-file=$(System.DefaultWorkingDirectory)/$(Release.Artifacts.<AzureBuildArtifactSourceAlias>.BuildId).zip。 將 <AzureBuildArtifactSourceAlias> 預留位置替換為你先前記下的 Build Source 別名。

    備註

    應用程式套件的版本號會被設定為變數。 這個變數允許覆蓋先前版本的套件,並允許你手動控制推送到 Azure Batch 的套件版本。

建立並執行發行版本

  1. 當你完成所有步驟建立後,在管線頁面頂端選擇 「儲存 」,然後選擇 「確定」。

  2. 在頁面頂端選擇 「建立發佈 」。

  3. 要查看正式發行狀態,請點選頁面頂端顯示已建立版本的連結。

  4. 要查看代理的日誌輸出,請將滑鼠移到舞台上,然後選擇 日誌 按鈕。

    截圖顯示發行狀態。

測試環境

環境建立完成後,請確認以下測試是否成功執行。 將預留位置替換成您的資源群組和 Batch 帳戶值。

連線到 Batch 帳戶

從命令提示字元使用 Azure CLI 連線到新的 Batch 帳戶。

  1. 請用 Azure 帳號az login登入,並依照指示進行驗證。
  2. 使用 az batch account login -g <resourceGroup> -n <batchAccount> 驗證 Batch 帳戶。

列出可用應用

az batch application list -g <resourceGroup> -n <batchAccount>

確認集區為有效

az batch pool list

在指令輸出中,請留意 currentDedicatedNodes 的值,以便在下一項測試中進行調整。

調整池大小

執行以下指令調整池大小,讓運算節點可用於工作與任務測試。 將 <poolName> 預留位置替換為您的集區名稱值,並將 <targetNumber> 預留位置替換為一個大於前一個指令輸出中 currentDedicatedNodes 的數字。 執行 az batch pool list 指令來檢查狀態,直到調整大小完成並顯示目標節點數目。

az batch pool resize --pool-id <poolname> --target-dedicated-nodes <target number>

下一步

請參考這些教學,了解如何透過簡單的應用程式與批次帳號互動。