分享方式:


整合 ARM 範本與 Azure Pipelines

您可以將 Azure Resource Manager 範本 (ARM 範本) 與 Azure Pipelines 整合來進行持續整合和持續部署 (CI/CD)。 在本文中,您將了解另外兩個使用 Azure Pipelines 部署範本的進階方式。

選取您的選項

繼續進行本文之前,讓我們先考慮從管線部署 ARM 範本的不同選項。

  • 使用 ARM 範本部署工作。 此選項是最簡單的。 當您想要直接從存放庫部署範本時,則適用此方法。 此選項不在本文討論範圍內,但會涵蓋在 ARM 範本與 Azure Pipelines 的持續整合教學課程中。 其中示範如何使用 ARM 範本部署工作,從您的 GitHub 存放庫部署範本。

  • 新增執行 Azure PowerShell 指令碼的工作。 此選項的優點是在整個開發生命週期中提供一致性,因為您可以使用執行本機測試時所使用的相同指令碼。 您的指令碼會部署範本,但也可以執行其他作業,例如取得要做為參數的值。 本文中將顯示此選項。 請參閱 Azure PowerShell 工作

    Visual Studio 提供包括 PowerShell 指令碼的 Azure 資源群組專案。 該指令碼會將您專案中的成品暫存至 Resource Manager 可存取的儲存體帳戶。 成品是您專案中的項目,例如連結的範本、指令碼和應用程式二進位檔。 如果您想繼續使用專案中的指令碼,請使用本文中所示範的 PowerShell 指令碼工作。

  • 新增工作以複製和部署工作。 此選項提供便利的專案指令碼替代方案。 您可以在管線中設定兩個工作。 一個工作會將成品暫存至可存取的位置。 另一個工作會從該位置部署範本。 本文中將顯示此選項。 請參閱複製和部署工作

準備您的專案

本文假設您的 ARM 範本和 Azure DevOps 組織已準備好建立管線。 下列步驟示範如何確定您已準備就緒:

  • 您有一個 Azure DevOps 組織。 如果您沒有帳戶,請免費建立一個。 如果您的團隊已有一個 Azure DevOps 組織,請確定您是所要使用 Azure DevOps 專案的管理員。

  • 您已設定 Azure 訂閱的服務連線。 管線中的工作會依據服務主體的身分識別來執行。 如需建立連線的步驟,請參閱建立 DevOps 專案

  • 您有一個 ARM 範本,其中定義了您專案的基礎結構。

建立管線

  1. 如果您先前尚未新增管線,則必須建立新的管線。 從您的 Azure DevOps 組織,選取 [管線] 和 [新增管線]

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

  2. 指定您程式碼的儲存位置。 下圖顯示為選取 Azure Repos Git

    在 Azure DevOps 中選取程式代碼來源的螢幕快照

  3. 從該來源,選取包括您專案程式碼的存放庫。

    在 Azure DevOps 中選取專案的存放庫螢幕快照

  4. 選取要建立的管線類型。 您可以選取 [入門管線]

    在 Azure DevOps 中選取要建立之管線類型的螢幕快照

您已準備好新增 Azure PowerShell 工作或複製檔案和部署工作。

Azure PowerShell 工作

本節示範如何使用在您專案中執行 PowerShell 指令碼的單一工作來設定持續部署。 如果您需要部署範本的 PowerShell 指令碼,請參閱 Deploy-AzTemplate.ps1Deploy-AzureResourceGroup.ps1

下列 YAML 檔案會建立 Azure PowerShell 工作

trigger:
- master

pool:
  vmImage: 'ubuntu-latest'

steps:
- task: AzurePowerShell@5
  inputs:
    azureSubscription: 'script-connection'
    ScriptType: 'FilePath'
    ScriptPath: './Deploy-AzTemplate.ps1'
    ScriptArguments: -Location 'centralus' -ResourceGroupName 'demogroup' -TemplateFile templates\mainTemplate.json
    azurePowerShellVersion: 'LatestVersion'

當您將工作設定為 AzurePowerShell@5 時,管線會使用 Az 模組。 如果您在指令碼中使用 AzureRM 模組,請將工作設為 AzurePowerShell@3

steps:
- task: AzurePowerShell@3

針對 azureSubscription,提供您建立的服務連線名稱。

inputs:
    azureSubscription: '<your-connection-name>'

針對 scriptPath,提供從管線檔案到您指令碼的相對路徑。 您可以查詢存放庫來查看路徑。

ScriptPath: '<your-relative-path>/<script-file-name>.ps1'

ScriptArguments 中,提供您指令碼所需的參數。 下列範例顯示指令碼的部分參數,但您必須自訂指令碼的參數。

ScriptArguments: -Location 'centralus' -ResourceGroupName 'demogroup' -TemplateFile templates\mainTemplate.json

當您選取 [儲存] 時,系統會自動執行組建管線。 返回您的組建管線摘要,並監看狀態。

Azure DevOps 中管線結果檢視的螢幕快照

您可以選取目前正在執行的管線來查看工作的詳細資料。 完成時,您會看到每個步驟的結果。

複製和部署工作

本節示範如何使用兩個工作來設定持續部署。 第一個工作會將成品暫存至儲存體帳戶,而第二個工作會部署範本。

若要將檔案複製到儲存體帳戶,必須將儲存體 Blob 資料參與者或儲存體 Blob 資料擁有者角色指派給服務連線的服務主體。 如需詳細資訊,請參閱開始使用 AzCopy

下列 YAML 顯示 Azure 檔案複製工作

trigger:
- master

pool:
  vmImage: 'windows-latest'

steps:
- task: AzureFileCopy@4
  inputs:
    SourcePath: 'templates'
    azureSubscription: 'copy-connection'
    Destination: 'AzureBlob'
    storage: 'demostorage'
    ContainerName: 'projecttemplates'
  name: AzureFileCopy

這項工作有幾個部分需要針對您的環境加以修改。 SourcePath 表示相對於管線檔案的成品位置。

SourcePath: '<path-to-artifacts>'

針對 azureSubscription,提供您建立的服務連線名稱。

azureSubscription: '<your-connection-name>'

針對儲存體和容器名稱,提供您要用於儲存成品的儲存體帳戶和容器名稱。 儲存體帳戶必須存在。

storage: '<your-storage-account-name>'
ContainerName: '<container-name>'

建立複製檔案工作之後,您就可以新增工作來部署暫存範本。

下列 YAML 顯示 Azure Resource Manager 範本部署工作

- task: AzureResourceManagerTemplateDeployment@3
  inputs:
    deploymentScope: 'Resource Group'
    azureResourceManagerConnection: 'copy-connection'
    subscriptionId: '00000000-0000-0000-0000-000000000000'
    action: 'Create Or Update Resource Group'
    resourceGroupName: 'demogroup'
    location: 'West US'
    templateLocation: 'URL of the file'
    csmFileLink: '$(AzureFileCopy.StorageContainerUri)templates/mainTemplate.json$(AzureFileCopy.StorageContainerSasToken)'
    csmParametersFileLink: '$(AzureFileCopy.StorageContainerUri)templates/mainTemplate.parameters.json$(AzureFileCopy.StorageContainerSasToken)'
    deploymentMode: 'Incremental'
    deploymentName: 'deploy1'

這項工作有幾個部分需要更詳細的檢閱。

  • deploymentScope:從下列選項中選取部署範圍:Management GroupSubscriptionResource Group。 若要深入了解範圍,請參閱部署範圍

  • azureResourceManagerConnection:提供您建立的服務連線名稱。

  • subscriptionId:提供目標訂閱識別碼。 此屬性僅適用於資源群組部署範圍和訂閱部署範圍。

  • resourceGroupNamelocation:提供您要部署的目標資源群組名稱和位置。 如果資源群組不存在,此工作會加以建立。

    resourceGroupName: '<resource-group-name>'
    location: '<location>'
    
  • csmFileLink:提供暫存範本的連結。 設定值時,請使用從檔案複製工作傳回的變數。 下列範例會連結至名為 mainTemplate.json 的範本。 其中包括名為 templates 的資料夾,因為檔案複製工作會將檔案複製到其中。 在您的管線中,提供您的範本路徑和名稱。

    csmFileLink: '$(AzureFileCopy.StorageContainerUri)templates/mainTemplate.json$(AzureFileCopy.StorageContainerSasToken)'
    

您的管線如下所示:

trigger:
- master

pool:
  vmImage: 'windows-latest'

steps:
- task: AzureFileCopy@4
  inputs:
    SourcePath: 'templates'
    azureSubscription: 'copy-connection'
    Destination: 'AzureBlob'
    storage: 'demostorage'
    ContainerName: 'projecttemplates'
  name: AzureFileCopy
- task: AzureResourceManagerTemplateDeployment@3
  inputs:
    deploymentScope: 'Resource Group'
    azureResourceManagerConnection: 'copy-connection'
    subscriptionId: '00000000-0000-0000-0000-000000000000'
    action: 'Create Or Update Resource Group'
    resourceGroupName: 'demogroup'
    location: 'West US'
    templateLocation: 'URL of the file'
    csmFileLink: '$(AzureFileCopy.StorageContainerUri)templates/mainTemplate.json$(AzureFileCopy.StorageContainerSasToken)'
    csmParametersFileLink: '$(AzureFileCopy.StorageContainerUri)templates/mainTemplate.parameters.json$(AzureFileCopy.StorageContainerSasToken)'
    deploymentMode: 'Incremental'
    deploymentName: 'deploy1'

當您選取 [儲存] 時,系統會自動執行建置管線。 在 [作業] 框架下,選取 [作業] 以查看作業狀態。

下一步