Share via


使用 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 基礎結構及發行應用程式套件。 下圖顯示一般部署流程 (假設程式碼是在本機開發):

Diagram showing the flow of deployment in the pipeline.

必要條件

若要遵循本文中的步驟,您需要:

準備解決方案

本文中的範例使用數個 ARM 範本,以及現有的開放原始碼影片處理應用程式 FFmpeg。 您可以複製或下載這些資源,並將其推送至您的 Azure Repos 存放庫。

重要

此範例會在以 Windows 為基礎的 Batch 節點上部署 Windows 軟體。 Azure Pipelines、ARM 範本和 Batch 也完全支援 Linux 軟體和節點。

了解 ARM 範本

三個功能範本 (類似於單元或模組) 會實作特定的功能片段。 端對端解決方案範本接著會部署基礎功能範本。 此連結的範本結構可讓我們對每個功能範本個別測試,並跨解決方案地重複使用這些功能範本。

Diagram showing a linked template structure using ARM templates.

如需關於範本的詳細資訊,請參閱 Microsoft.Batch 資源類型的 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'))]"
        }
    }
}

Batch 帳戶範本

將下列程式碼儲存為名為 batchAccount.json 的檔案。 此範本會定義 Batch 帳戶。 Batch 帳戶可做為跨節點集區執行應用程式的平台。

{
    "$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": {}
}

Batch 集區範本

將下列程式碼儲存為名為 batchAccountPool.json 的檔案。 此範本會在 Batch 帳戶中建立節點集區和節點。

{
    "$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. 針對應用程式封裝,下載並解壓縮 FFmpeg 4.3.1 的 Windows 64 位元版本,並將其上傳至存放庫中的 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 資料夾。
  • pipelines 資料夾,其中包含建置管線的 YAML 組建定義檔。

Screenshot of the repository structure.

注意

此範例程式碼基底結構示範您可以將應用程式、基礎結構和管線程式碼儲存在相同的存放庫中。

建立 Azure 管線

設定原始程式碼存放庫之後,請使用 Azure Pipelines 為您的應用程式實作建置、測試和部署管線。 在管線的這個階段中,您通常會執行測試來驗證程式碼並建置軟體片段。 測試的數目和類型,以及您執行的任何其他工作,取決於您的整體建置和發行策略。

建立建置管線

在本節中,您會建立 YAML 建置管線,以使用 Batch 帳戶中執行的 ffmpeg 軟體。

  1. 在 Azure DevOps 專案的左側導覽列中選取 [管線],然後選取 [新增管線]

  2. 在 [您的程式碼在何處] 畫面上,選取 [Azure Repos Git]

    Screenshot of the New pipeline screen.

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

    注意

    您也可以使用視覺設計工具來建立建置管線。 在 [新增管線] 頁面上,選取 [使用傳統編輯器]。 您可以在視覺設計工具中使用 YAML 範本。 如需詳細資訊,請參閱定義您的傳統管線

  4. 在 [設定管線] 畫面上,選取 [現有的 Azure Pipelines YAML 檔案]

  5. 在 [選取現有的 YAML 檔案] 畫面上,從您的存放庫選取 hpc-app.build.yml 檔案,然後選取 [繼續]

  6. 在 [檢閱管線 YAML] 畫面上,檢閱組建組態,然後選取 [執行],或選取 [執行] 旁的下拉式插入符號,然後選取 [儲存]。 此範本會啟用持續整合,因此當存放庫的新認可符合建置中設定的條件時,建置就會自動觸發。

    Screenshot of an existing Build pipeline.

  7. 您可以檢視即時建置進度的更新。 若要查看建置結果,請從 Azure Pipelines 中的組建定義中選取適當的執行。

    Screenshot of live outputs from build in Azure Pipelines.

注意

如果您使用用戶端應用程式來執行 HPC 解決方案,您需要為該應用程式建立個別的組建定義。 如需操作指南,請參閱 Azure Pipelines 文件。

建立發行管線

您可以使用 Azure Pipelines 發行管線 來部署應用程式和基礎結構。 發行管線會啟用 CD,並將發行程序自動化。 部署應用程式和基礎結構有數個步驟。

此解決方案的連結範本必須可從公用 HTTP 或 HTTPS 端點存取。 此端點可能是 GitHub 存放庫,或 Azure Blob 儲存體帳戶或其他儲存位置。 為了確保上傳的範本成品可以保持安全,請以私人模式將其保存,但使用某種形式的共用存取簽章 (SAS) 權杖加以存取。

下列範例示範如何使用 Azure 儲存體 Blob 中的範本來部署基礎結構和應用程式。

設定管線

  1. 在您的 Azure DevOps 專案上,選取左側導覽中的 [管線]>[發行]

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

  3. 在 [選取範本] 畫面上,選取 [空白作業],然後關閉 [階段] 畫面。

  4. 選取頁面頂端的 [新增發行管線],並將管線重新命名為與管線相關的名稱,例如 [部署 Azure Batch + 集區]

    Screenshot of the initial release pipeline.

  5. 在 [成品] 區段中,選取 [新增]

  6. 在 [新增成品] 畫面上,選取 [建置],然後選取您的建置管線以取得 HPC 應用程式的輸出。

    注意

    您可以建立來源別名或接受預設值。 記下 [來源別名] 值,因為您需要此值,才能在發行定義中建立工作。

    Screenshot showing an artifact link to the hpc-application package in the build pipeline.

  7. 選取 [新增]。

  8. 在管線頁面上,選取 [成品] 旁的 [新增],為另一個成品 (也就是您的 Azure Repos 存放庫) 建立連結。 需要此連結才能存取存放庫中的 ARM 範本。 ARM 範本不需要編譯,因此不需要透過建置管線來推送。

    注意

    再次記下來源別名值以供稍後使用。

    Screenshot showing an artifact link to the Azure Repos repository.

  9. 選取 [變數] 索引標籤。在管線中建立下列變數,讓您不用將相同的資訊重新輸入多個工作。

    名稱
    applicationStorageAccountName 保存 HPC 應用程式二進位檔的儲存體帳戶名稱。
    batchAccountApplicationName Batch 帳戶中應用程式的名稱。
    batchAccountName Batch 帳戶的名稱。
    batchAccountPoolName 要進行處理的虛擬機器 (VM) 集區名稱。
    batchApplicationId Batch 應用程式的唯一識別碼,格式如下:
    /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>^
    /providers/Microsoft.Batch/batchAccounts/<batchAccountName>^
    /applications/<batchAccountApplicationName>.

    <subscriptionId> 預留位置取代為您的 Azure 訂用帳戶標識碼,並將其他預留位置取代為您為此清單中其他變數設定的值。
    batchApplicationVersion Batch 應用程式的語意版本,在此案例中為 4.3.1
    位置 要部署資源的 Azure 區域。
    resourceGroupName 要部署資源的資源群組名稱。
    storageAccountName 用來保存連結 ARM 範本的儲存體帳戶名稱。
    StorageContainerSasToken $(<referenceName>.StorageContainerSasToken). 將 <referenceName 預留位置取代為下列 Azure 檔案複製步驟的 [輸出變數] 區段中,您設定的 [參考名稱] 值。
    StorageContainerUri $(<referenceName>.StorageContainerUri). 將 <referenceName> 預留位置取代為 Azure 檔案複製步驟的 [輸出變數] 區段中,您設定的 [參考名稱] 值。

    Screenshot showing variables set for the Azure Pipelines release.

  10. 選取 [工作] 索引標籤,然後選取 [代理程式作業]

  11. 在 [代理程式作業] 畫面的 [代理程式集區] 底下,選取[Azure Pipelines]

  12. 在 [代理程式規格] 底下,選取[windows-latest]

    Screenshot showing the Agent job settings.

新增工作

建立六個工作來執行下列作業:

  • 下載壓縮的 ffmpeg 檔案。
  • 部署儲存體帳戶以裝載巢狀 ARM 範本。
  • 將 ARM 範本複製到儲存體帳戶。
  • 部署 Batch 帳戶和必要的相依性。
  • 在 Batch 帳戶中建立應用程式。
  • 將應用程式套件上傳至 Batch 帳戶。

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

  1. 選取左側窗格中 [代理程式作業] 旁的 + 符號。

  2. 在右側窗格中搜尋並選取指定的工作。

  3. 新增或選取屬性來設定工作。

  4. 選取 [新增]。

    Screenshot showing the tasks used to release the HPC application to Azure Batch.

建立工作,如下所示:

  1. 選取 [下載管線成品] 工作並設定下列屬性:

    • 顯示名稱:輸入 [將 ApplicationPackage 下載至代理程式]
    • 成品名稱:輸入 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 檔案複製
    • 來源:輸入 $(System.ArtifactsDirectory)/<AzureRepoArtifactSourceAlias>/arm-templates/。 將 <AzureRepoArtifactSourceAlias> 預留位置取代為您先前記下的存放庫來源別名。
    • Azure 訂用帳戶:選取適當的 Azure 訂用帳戶。
    • 目的地類型:選取 [Azure Blob]
    • RM 儲存體帳戶:輸入 $(storageAccountName)
    • 容器名稱:輸入範本
    • 參考名稱:展開 [輸出變數],然後輸入 ffmpeg

    注意

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

  4. 部署協調器 ARM 範本以建立 Batch 帳戶和集區。 此範本包含儲存體帳戶容器 URI 和 SAS 權杖的參數。 ARM 範本中所需的變數會保留在發行定義的變數區段中,並從 AzureBlob 檔案複製工作進行設定。

    選取 [ARM 範本部署:資源群組範圍] 工作,並設定下列屬性:

    • 顯示名稱:輸入 [部署 Azure Batch]
    • Azure Resource Manager 連線:選取適當的 Azure 訂用帳戶。
    • 訂用帳戶:選取適當的 Azure 訂用帳戶。
    • 動作:選取 [建立或更新資源群組]
    • 資源群組:輸入 $(resourceGroupName)
    • 位置:輸入 $(location)
    • 範本位置:選取 [檔案的 URL]
    • 範本連結:輸入 $(StorageContainerUri)arm-templates/deployment.json$(StorageContainerSasToken)
    • 覆寫範本參數:輸入 -StorageContainerUri $(StorageContainerUri) -StorageContainerSasToken $(StorageContainerSasToken) -applicationStorageAccountName $(applicationStorageAccountName) -batchAccountName $(batchAccountName) -batchAccountPoolName $(batchAccountPoolName)

    常見的做法是使用 Azure Key Vault 工作。 如果連線到您 Azure 訂用帳戶的服務主體已設定適當的存取原則,那麼即可從 Key Vault 下載祕密並作為您管線中的變數。 祕密的名稱會以相關聯的值進行設定。 例如,您可以在發行定義中使用 $(sshPassword) 來參考 sshPassword 的祕密。

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

    選取 [Azure CLI] 工作並設定下列屬性:

    • 顯示名稱: 輸入 [在 Azure Batch 帳戶中建立應用程式]
    • Azure Resource Manager 連線:選取適當的 Azure 訂用帳戶。
    • 指令類型:選取 [PowerShell Core]
    • 指令碼位置:選取 [內嵌指令碼]
    • 內嵌指令碼:輸入 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 Core]
    • 指令碼位置:選取 [內嵌指令碼]
    • 內嵌指令碼:輸入 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> 預留位置取代為您先前記下的建置來源別名。

    注意

    應用程式套件的版本號碼會設定為變數。 此變數可讓您覆寫先前的套件版本,並讓您手動控制推送至 Azure Batch 的套件版本。

建立並執行發行

  1. 當您完成建立所有步驟時,請選取管線頁面頂端的 [儲存],然後選取 [確定]

  2. 選取頁面頂端的 [建立發行]

  3. 若要檢視即時發行狀態,請選取頁面頂端指出發行已建立的連結。

  4. 若要檢視代理程式的記錄輸出,請將滑鼠停留在階段上,然後選取 [記錄] 按鈕。

    Screenshot showing status of the release.

測試環境

設定環境之後,請確認下列測試已成功執行。 將預留位置取代為您的資源群組和 Batch 帳戶值。

連線到 Batch 帳戶

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

  1. 使用 az login 登入您的 Azure 帳戶,並遵循指示進行驗證。
  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>

下一步

請參閱下列教學課程,以便了解如何透過簡單的應用程式來與 Batch 帳戶互動。