共用方式為


Azure VM Image Builder Service DevOps 工作 (預覽)

適用於:✔️ Linux VM ✔️ 彈性擴展集

在本文中,您會了解如何使用 Azure DevOps 工作,將組建成品插入虛擬機器 (VM) 映像中,以便您安裝及設定應用程式和作業系統。

重要

VM Image Builder 的 Azure DevOps 工作目前為預覽狀態。 請參閱 Microsoft Azure 預覽版增補使用規定,以了解適用於 Azure 功能 (搶鮮版 (Beta)、預覽版,或尚未正式發行的版本) 的法律條款。

DevOps 工作版本

目前 Azure VM Image Builder DevOps 工作有兩種:

必要條件

注意

VM Image Builder 工作目前不支援 Windows 重新啟動或以系統管理員身分執行提高權限的命令。 也就是說,該工作不適用於需要這些功能的 Azure 虛擬桌面案例或 Windows 自訂項目。 如果要搭配 VM Image Builder 使用 DevOps,請將 Azure Resource Manager 中的工作範本巢狀化,並使用 Azure CLI 或 PowerShell 工作。

開始進行之前,您必須:

  • 從 Visual Studio Marketplace 安裝「穩定的」 DevOps 工作

  • 擁有 Azure DevOps Services (原為 Visual Studio Team Services或 VSTS) 帳戶,以及已建立的組建管線。

  • 在管線所使用的訂閱中註冊並啟用 VM Image Builder 功能需求:

  • 在來源映像資源群組中建立標準 Azure 儲存體帳戶。 您可以使用其他資源群組或儲存體帳戶。 儲存體帳戶用於將組建成品從 DevOps 工作傳輸到映像。

    # Azure PowerShell
    $timeInt=$(get-date -UFormat "%s")
    $storageAccName="aibstorage"+$timeInt
    $location=westus
    # Create a storage account and blob in the resource group
    New-AzStorageAccount -ResourceGroupName $strResourceGroup -Name $storageAccName -Location $location -SkuName Standard_LRS
    
    # The Azure CLI
    location=westus
    scriptStorageAcc=aibstordot$(date +'%s')
    # Create a storage account and blob in the resource group
    az storage account create -n $scriptStorageAcc -g $strResourceGroup -l $location --sku Standard_LRS
    

將工作新增至發行管線

  1. 選取 [發行管線]>[編輯]

  2. 在 [使用者代理程式] 上,選取加號 (+) 來新增和搜尋 [Image Builder]

  3. 選取 [新增]。

在下列各節中,設定工作屬性。

Azure 訂用帳戶

在下拉式清單中,選取您想讓 VM Image Builder 執行的訂用帳戶。 針對您的來源映像以及要散發的映像,使用儲存這些映像的訂用帳戶。 您必須授與存取權,讓 VM Image Builder 參與者存取訂用帳戶或資源群組。

資源群組

使用將儲存臨時映像範本成品的資源群組。 當您建立範本成品時,會建立其他的臨時 VM Image Builder 資源群組 IT_<DestinationResourceGroup>_<TemplateName>_guid。 臨時資源群組會儲存影像中繼資料,例如指令碼。 工作結束時,會刪除映像範本成品和臨時 VM Image Builder 資源群組。

Location

位置是將執行 VM Image Builder 的區域。 僅支援固定數量的區域。 來源映像必須存在於這個位置。 舉例來說,如果您使用的是 Azure Compute Gallery (原為共用映像庫),則該區域中必須要有一份複本。

受控識別 (必須)

VM Image Builder 需要受控識別以讀取來源自訂映像、連線到 Azure 儲存體,並建立自訂映像。 如需詳細資訊,請參閱深入了解 VM Image Builder

虛擬網路支援

您可以將建立的 VM 設定為位於特定虛擬網路中。 當您設定工作時,在 [VNet 設定 (選用)] 輸入欄位中,提供預先存在的子網路資源識別碼。 如果不需要使用特定虛擬網路,則省略資源識別碼。 如需詳細資訊,請參閱 Azure VM Image Builder 服務網路功能選項

來源

來源映像必須是支援的 VM Image Builder 作業系統。 您可以在執行 VM Image Builder 的相同區域中選擇現有的自訂映像:

  • 受控映像:傳入資源識別碼。 例如:

    /subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/images/<imageName>
    
  • Compute Gallery:傳入映像版本的資源識別碼。 例如:

    /subscriptions/$subscriptionID/resourceGroups/$sigResourceGroup/providers/Microsoft.Compute/galleries/$sigName/images/$imageDefName/versions/<versionNumber>
    

    如果您需要取得最新的 Compute Gallery 版本,請使用 Azure PowerShell 或 Azure CLI 工作來取得並設定 DevOps 變數。 使用 VM Image Builder DevOps 工作中的變數。 如需詳細資訊,請參閱取得最新映像版本資源識別碼中的範例。

  • (市集) 基底映像:使用熱門映像的下拉式清單,其會一律使用支援作業系統的最新版本。

    如果清單中沒有基礎映像,您可以使用 Publisher:Offer:Sku 來指定確切的映像。

    (選擇性) 基礎映像版本:您可以提供欲使用的映像版本。 預設版本為 latest

自訂

下列各節將討論自訂工作的各種方式。

佈建程式

首先,Shell 和 PowerShell 這兩種自訂工具都有支援。 僅支援內嵌。 如果想要下載指令碼,您可以傳遞內嵌命令以下載。

針對您的作業系統選取 PowerShell 或 Shell。

Windows Update 工作

此工作會在自訂項目結束時執行 Windows Update (僅適用於 Windows)。 此工作也會處理必要的重新開機。

此工作會執行下列 Windows Update 設定:

    "type": "WindowsUpdate",
    "searchCriteria": "IsInstalled=0",
    "filters": [
        "exclude:$_.Title -like '*Preview*'",
        "include:$true"

此工作會安裝重要且建議的非「預覽」版 Windows 更新。

處理重新開機

DevOps 工作目前不支援重開 Windows 組建。 如果您嘗試使用 PowerShell 程式碼來重開,那麼組建會失敗。 不過,您可以利用程式碼來重開 Linux 組建。

組建路徑

此工作的設計目的是要能在映像中插入 DevOps 組建發行成品。 如要達成此目的,您必須設定組建管線。 在設定發行管線時,請新增組建成品的存放庫。

顯示如何在發行管線中新增成品的螢幕快照。

選取 [組建路徑] 按鈕以選擇要放在映像上的組建資料夾。 VM Image Builder 工作會複製其中所有檔案和目錄。 建立映像時,VM Image Builder 會根據作業系統將檔案和目錄部署到不同的路徑。

重要

您在新增存放庫成品時,可能會發現目錄名稱前面加上了底線字元 (_)。 此底線可能會導致內嵌命令的問題。 請務必在命令中使用適當的引號。

下列範例說明其運作方式:

顯示階層的目錄結構的螢幕快照。

  • 若為 Windows:檔案存在於「C:」 磁碟機中。 建立名為 buildArtifacts 的目錄,其中包含了 webapp 目錄。

  • 若為 Linux:檔案存在於 /tmp 目錄中。 系統會建立 webapp 目錄,其中包含所有檔案和目錄。 因為這是個臨時目錄,所以您必須將檔案移出。 否則,檔案將會遭到刪除。

內嵌自訂指令碼

  • 若為 Windows:您可以輸入以逗號分隔的 PowerShell 內嵌命令。 如果您想要在組建目錄中執行指令碼,您可以使用:

    & 'c:\buildArtifacts\webapp\webconfig.ps1'
    

    您可以參考多個指令碼或新增更多命令。 例如:

    & 'c:\buildArtifacts\webapp\webconfig.ps1'
    & 'c:\buildArtifacts\webapp\installAgent.ps1'
    
  • 若為 Linux:組建成品會放入 /tmp 目錄中。 不過,許多 Linux 作業系統重新開機時,/tmp 目錄的內容會被刪除。 如果您想要讓成品存在映像中,您必須建立另一個目錄並將成品複製過去。 例如:

    sudo mkdir /lib/buildArtifacts
    sudo cp -r "/tmp/_ImageBuilding/webapp" /lib/buildArtifacts/.
    

    如果確定要使用 /tmp 目錄,那麼您可以使用下列程式碼來執行指令碼:

    # Grant execute permissions to run scripts
    sudo chmod +x "/tmp/_ImageBuilding/webapp/coreConfig.sh"
    echo "running script"
    sudo . "/tmp/AppsAndImageBuilderLinux/_WebApp/coreConfig.sh"
    

映像組建後,組建成品會發生什麼事?

注意

VM Image Builder 不會自動移除組建成品。 我們強烈建議您一律使用程式碼來移除組建成品。

  • 若為 Windows:VM Image Builder 會將檔案部署到 C:\buildArtifacts 目錄。 因為目錄會保存下來,所以您必須執行指令碼來移除目錄。 例如:

    # Clean up buildArtifacts directory
    Remove-Item -Path "C:\buildArtifacts\*" -Force -Recurse
    
    # Delete the buildArtifacts directory
    Remove-Item -Path "C:\buildArtifacts" -Force
    
  • 若為 Linux:組建成品會放入 /tmp 目錄中。 不過,許多 Linux 作業系統重新開機時,/tmp 目錄的內容會被刪除。 我們建議您使用程式碼來移除內容,而非依賴作業系統來移除內容。 例如:

    sudo rm -R "/tmp/AppsAndImageBuilderLinux"
    

映像組建的總長度

在 DevOps 管線工作中尚無法變更總長度。 它會採用 240 分鐘的預設值。 如果想要增加 buildTimeoutInMinutes,那麼您可以在發行管線中使用 Azure CLI 工作。 設定工作以複製範本並提交。 如需範例解決方案,請參閱搭配 VM Image Builder 使用環境變數和參數,或使用 Azure PowerShell。

儲存體帳戶

選取您在先決條件中建立的儲存體帳戶。 如果您沒有在清單中看到儲存體帳戶,表示 VM Image Builder 沒有其存取權限。

組建開始時,VM Image Builder 會建立名為 imagebuilder-vststask 的容器,其中會儲存來自存放庫的組建成品。

注意

您必須在每次組建之後手動刪除儲存體帳戶或容器。

散佈

支援下列三種散發類型。

受控映像

  • 資源識別碼:

    /subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/images/<imageName>
    
  • 位置

Compute Gallery 必須已經存在。

  • 資源識別碼:

    /subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<galleryName>/images/<imageDefName>
    
  • 區域:以逗號分隔的區域清單。 例如 westuseastuscentralus

虛擬硬碟

您無法將任何值傳遞至此。 VM Image Builder 會將虛擬硬碟 VHD 發出至 vhds 容器中的臨時 VM Image Builder 資源群組 IT_<DestinationResourceGroup>_<TemplateName>。 當您開始發行組建時,VM Image Builder 會發出記錄。 VM Image Builder 會在完成時發出 VHD URL。

選擇性設定

您可以從 Standard_D1_v2 的預設大小來覆寫 VM 大小設定。 您可能會想以此來減少總自訂時間。 或者,您可能會想建立相依於特定 VM 大小的映像,例如 GPU (圖形處理器)、HPC (高效能運算) 等等。

工作的運作方式

建立發行時,此工作會在名為 imagebuilder-vststask 的儲存體帳戶中建立容器。 此工作會壓縮並上傳您的組建成品,然後為該 ZIP 檔案建立共用存取簽章權杖。

此工作會使用傳遞至工作的屬性來建立 VM Image Builder 範本成品。 此工作會執行下列動作:

  • 下載組建成品 zip 檔案和任何其他相關聯的指令碼。 這些檔案會儲存在臨時 VM Image Builder 資源群組 IT_<DestinationResourceGroup>_<TemplateName> 內的儲存體帳戶中。

  • 建立前面加上 t_ 和 10 位單一整數的範本。 該範本會儲存至您選取的資源群組,而且該範本於資源群組中的組建期間內都會存在。

範例輸出︰

start reading task parameters...
found build at:  /home/vsts/work/r1/a/_ImageBuilding/webapp
end reading parameters
getting storage account details for aibstordot1556933914
created archive /home/vsts/work/_temp/temp_web_package_21475337782320203.zip
Source for image:  { type: 'SharedImageVersion',
  imageVersionId: '/subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<galleryName>/images/<imageDefName>/versions/<imgVersionNumber>' }
template name:  t_1556938436xxx
starting put template...

映像組建開始時,會在發行記錄中回報執行狀態:

starting run template...

映像組建完成時,其輸出會類似下列文字:

2019-05-06T12:49:52.0558229Z starting run template...
2019-05-06T13:36:33.8863094Z run template:  Succeeded
2019-05-06T13:36:33.8867768Z getting runOutput for  SharedImage_distribute
2019-05-06T13:36:34.6652541Z ==============================================================================
2019-05-06T13:36:34.6652925Z ## task output variables ##
2019-05-06T13:36:34.6658728Z $(imageUri) =  /subscriptions/<subscriptionID>/resourceGroups/aibwinsig/providers/Microsoft.Compute/galleries/my22stSIG/images/winWAppimages/versions/0.23760.13763
2019-05-06T13:36:34.6659989Z ==============================================================================
2019-05-06T13:36:34.6663500Z deleting template t_1557146959485...
2019-05-06T13:36:34.6673713Z deleting storage blob imagebuilder-vststask\webapp/18-1/webapp_1557146958741.zip
2019-05-06T13:36:34.9786039Z blob imagebuilder-vststask\webapp/18-1/webapp_1557146958741.zip is deleted
2019-05-06T13:38:37.4884068Z delete template:  Succeeded

映像範本和 IT_<DestinationResourceGroup>_<TemplateName> 已刪除。

您可以採用 $(imageUri) Azure DevOps Services (原為 Visual Studio Team Services 或 VSTS) 變數,並在下一個工作中使用該變數,或僅僅使用該值並組建 VM。

輸出 DevOps 變數

以下是來源 Marketplace 映像的發行者、供應項目、SKU 和版本:

  • $(pirPublisher)
  • $(pirOffer)
  • $(pirSku)
  • $(pirVersion)

以下是映像 URI,是分散式映像的資源識別碼:

  • $(imageUri)

常見問題集

我可以使用已在 DevOps 外建立的現有映像範本嗎?

目前不能。

我可以指定映像範本的名稱嗎?

否。 映像範本會使用唯一的範本名稱然後刪除之。

VM Image Builder 工作失敗。 我能如何針對這個問題進行疑難排解?

如果發生組建失敗,DevOps 工作將不會刪除預備資源群組。 您可以存取包含組建自訂記錄的預備資源群組。

您會在 VM Image Builder 工作的 DevOps 記錄中看到錯誤,而該訊息會包含 customization.log 位置。 例如:

說明失敗的範例 DevOps 工作錯誤的螢幕快照,並提供customization.log檔案的位置。

如需詳細資訊,請參閱針對 VM Image Builder 服務進行疑難排解

調查完此失敗之後,您就可以刪除暫存資源群組。 首先,刪除 VM Image Builder 範本資源成品。 成品前面會加上 t_,您可以在 DevOps 工作組建記錄中找到:

...
Source for image:  { type: 'SharedImageVersion',
  imageVersionId: '/subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<galleryName>/images/<imageDefName>/versions/<imgVersionNumber>' }
...
template name:  t_1556938436xxx
...

VM Image Builder 範本資源成品位於工作一開始指定的資源群組中。 完成疑難排解後,請刪除成品。 如果您要使用 Azure 入口網站來將其刪除,請在資源群組內選取 [顯示隱藏類型] 以檢視成品。

下一步

如需詳細資訊,請參閱 VM Image Builder 概觀