整合 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 組織,選取 [管線] 和 [新增管線]

    Screenshot of the Add new pipeline button

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

    Screenshot of selecting the code source in Azure DevOps

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

    Screenshot of selecting the repository for the project in Azure DevOps

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

    Screenshot of selecting the type of pipeline to create in 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

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

Screenshot of the pipeline results view in 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'

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

下一步