Integrieren von ARM-Vorlagen in Azure Pipelines

Sie können Azure Resource Manager-Vorlagen (ARM-Vorlagen) in Azure Pipelines integrieren für Continuous Integration und Continuous Deployment (CI/CD). In diesem Artikel lernen Sie zwei fortgeschrittene Methoden kennen, um Vorlagen mit Azure Pipelines bereitzustellen.

Auswählen einer Option

Bevor Sie mit diesem Artikel fortfahren, machen Sie sich mit den verschiedenen Optionen für die Bereitstellung einer ARM-Vorlage über eine Pipeline vertraut.

  • Verwenden einer Aufgabe zur ARM-Vorlagenbereitstellung. Diese Option stellt den einfachsten Ansatz dar. Diese Vorgehensweise funktioniert, wenn Sie eine Vorlage direkt aus einem Repository bereitstellen möchten. Diese Option wird nicht in diesem Artikel behandelt, sondern im Tutorial Continuous Integration von ARM-Vorlagen mit Azure Pipelines. Es wird gezeigt, wie Sie die Aufgabe zur ARM-Vorlagenbereitstellung verwenden, um eine Vorlage aus Ihrem GitHub-Repository bereitzustellen.

  • Hinzufügen einer Ausgabe, die ein Azure PowerShell-Skript ausführt. Diese Option bietet einen konsistenten Entwicklungslebenszyklus, da Sie dasselbe Skript verwenden können, das Sie zur Ausführung lokaler Tests verwendet haben. Ihr Skript stellt die Vorlage bereit, kann aber auch andere Vorgänge ausführen, z. B. das Abrufen von Werten, die als Parameter verwendet werden sollen. Diese Option wird in diesem Artikel gezeigt. Weitere Informationen finden Sie unter Azure PowerShell-Aufgabe.

    Visual Studio stellt das Azure Resource Group-Projekt bereit, das ein PowerShell-Skript enthält. Das Skript stellt Artefakte aus Ihrem Projekt einem Speicherkonto zur Verfügung, auf das der Resource Manager zugreifen kann. Artefakte sind Elemente in Ihrem Projekt, wie z.B. verknüpfte Vorlagen, Skripte und Binärdateien von Anwendungen. Wenn Sie das Skript aus dem Projekt weiterhin verwenden möchten, verwenden Sie die in diesem Artikel gezeigte PowerShell-Skriptaufgabe.

  • Hinzufügen von Aufgaben zum Kopieren und Bereitstellen von Tasks. Diese Option bietet eine praktische Alternative zum Projektskript. Sie konfigurieren zwei Aufgaben in der Pipeline. Eine Aufgabe stellt die Artefakte an einem zugänglichen Speicherort zur Verfügung. Die andere Aufgabe stellt die Vorlage von diesem Ort aus bereit. Diese Option wird in diesem Artikel gezeigt. Weitere Informationen finden Sie unter Aufgaben zum Kopieren und Bereitstellen.

Vorbereiten Ihres Projekts

In diesem Artikel wird vorausgesetzt, dass Ihre ARM-Vorlage und Ihre Azure DevOps-Organisation für die Erstellung der Pipeline bereit sind. Die folgenden Schritte zeigen, wie Sie sicherstellen können, dass Sie bereit sind:

  • Sie haben eine Azure DevOps-Organisation. Sollten Sie über keine Organisation verfügen, können Sie kostenlos eine erstellen. Wenn Ihr Team bereits über eine Azure DevOps-Organisation verfügt, stellen Sie sicher, dass Sie Administrator des Azure DevOps-Projekts sind, das Sie verwenden möchten.

  • Sie haben eine Dienstverbindung zu Ihrem Azure-Abonnement konfiguriert. Die Aufgaben in der Pipeline werden unter der Identität des Dienstprinzipals ausgeführt. Die Schritte zum Erstellen der Verbindung finden Sie unter Erstellen eines DevOps-Projekts.

  • Sie haben eine ARM-Vorlage, die die Infrastruktur für Ihr Projekt definiert.

Erstellen der Pipeline

  1. Wenn Sie noch keine Pipeline hinzugefügt haben, müssen Sie eine neue Pipeline erstellen. Wählen Sie aus Ihrer Azure DevOps-Organisation Pipelines und Neue Pipeline aus.

    Screenshot: Schaltfläche zum Hinzufügen einer neuen Pipeline

  2. Geben Sie an, wo Ihr Code gespeichert ist. Die folgende Abbildung zeigt die Auswahl von Azure Repos-Git.

    Screenshot: Auswählen der Codequelle in Azure DevOps

  3. Wählen Sie aus dieser Quelle das Repository aus, das den Code für Ihr Projekt enthält.

    Screenshot: Auswählen des Repositorys für das Projekt in Azure DevOps

  4. Wählen Sie den zu erstellenden Pipelinetyp aus. Sie können Starterpipeline auswählen.

    Screenshot: Auswählen des zu erstellenden Pipelinetyps in Azure DevOps

Sie können jetzt entweder die Azure PowerShell-Aufgabe oder die Aufgaben zum Kopieren und Bereitstellen der Datei hinzufügen.

Azure PowerShell-Aufgabe

In diesem Abschnitt wird gezeigt, wie Sie die Continuous Deployment mithilfe einer einzelnen Aufgabe konfigurieren, die das PowerShell-Skript in Ihrem Projekt ausführt. Wenn Sie ein PowerShell-Skript benötigen, das eine Vorlage bereitstellt, finden Sie weitere Informationen unter Deploy-AzTemplate.ps1 oder Deploy-AzureResourceGroup.ps1.

Die folgende YAML-Datei erstellt eine Azure PowerShell-Aufgabe:

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'

Wenn Sie die Aufgabe auf AzurePowerShell@5 festlegen, verwendet die Pipeline das Az module. Wenn Sie das AzureRM-Modul in Ihrem Skript verwenden, legen Sie die Aufgabe auf AzurePowerShell@3 fest.

steps:
- task: AzurePowerShell@3

Geben Sie für azureSubscription den Namen der von Ihnen erstellten Dienstverbindung an.

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

Geben Sie für scriptPath den relativen Pfad von der Pipelinedatei zu Ihrem Skript an. Den Pfade finden Sie in Ihrem Repository.

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

Geben Sie in ScriptArguments alle für Ihr Skript erforderlichen Parameter an. Das folgende Beispiel zeigt einige Parameter für ein Skript, aber Sie müssen die Parameter für Ihr Skript anpassen.

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

Bei der Auswahl von Speichern wird die Buildpipeline automatisch ausgeführt. Gehen Sie zurück zur Zusammenfassung Ihrer Buildpipeline und schauen Sie sich den Status an.

Screenshot: Ansicht der Pipelineergebnisse in Azure DevOps

Sie können die aktuell laufende Pipeline auswählen, um Details zu den Aufgaben anzuzeigen. Nach Abschluss werden die Ergebnisse für jeden Schritt angezeigt.

Aufgaben zum Kopieren und Bereitstellen

In diesem Abschnitt erfahren Sie, wie Sie Continuous Deployment mithilfe von zwei Aufgaben konfigurieren. Die erste Aufgabe stellt die Artefakte in einem Speicherkonto bereit, die zweite Aufgabe stellt die Vorlage bereit.

Um Dateien in ein Speicherkonto zu kopieren, muss dem Dienstprinzipal für die Dienstverbindung die Rolle „Mitwirkender von Speicherblobdaten“ oder „Besitzer von Speicherblobdaten“ zugewiesen werden. Weitere Informationen finden Sie unter Erste Schritte mit AzCopy.

Die folgende YAML zeigt die Aufgabe für den Azure-Dateikopiervorgang.

trigger:
- master

pool:
  vmImage: 'windows-latest'

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

Diese Aufgabe umfasst mehrere Teile, die Sie für Ihre Umgebung überarbeiten müssen. SourcePath gibt den Speicherort der Artefakte relativ zur Pipelinedatei an.

SourcePath: '<path-to-artifacts>'

Geben Sie für azureSubscription den Namen der von Ihnen erstellten Dienstverbindung an.

azureSubscription: '<your-connection-name>'

Geben Sie für Speicher- und Containername die Namen des Speicherkonto und des Containers an, den Sie für die Speicherung der Artefakte verwenden möchten. Das Speicherkonto muss bereits vorhanden sein.

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

Nachdem Sie die Aufgabe „Datei kopieren“ erstellt haben, sind Sie bereit, um die Aufgabe hinzuzufügen, um die bereitgestellte Vorlage bereitzustellen.

Der folgende YAML-Code zeigt die Aufgabe für die Azure Resource Manager-Vorlagenbereitstellung:

- task: AzureResourceManagerTemplateDeployment@3
  inputs:
    deploymentScope: 'Resource Group'
    azureResourceManagerConnection: 'copy-connection'
    subscriptionId: 'aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e'
    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'

Diese Aufgabe umfasst mehrere Teile, die näher betrachtet werden sollten.

  • deploymentScope: Wählen Sie aus den folgenden Optionen den Umfang der Bereitstellung aus: Management Group, Subscription und Resource Group. Weitere Informationen zum Umfang finden Sie unter Bereitstellungsumfang.

  • azureResourceManagerConnection: Geben Sie den Namen der von Ihnen erstellten Dienstverbindung an.

  • subscriptionId: Geben Sie die Zielabonnement-ID an. Diese Eigenschaft gilt nur für den Bereitstellungsumfang „Ressourcengruppe“ und „Abonnement“.

  • resourceGroupName und location: Geben Sie den Namen und den Standort der Ressourcengruppe an, in der die Bereitstellung erfolgen soll. Diese Aufgabe erstellt die Ressourcengruppe, wenn diese noch nicht vorhanden ist.

    resourceGroupName: '<resource-group-name>'
    location: '<location>'
    
  • csmFileLink: Geben Sie den Link für die bereitgestellte Vorlage an. Verwenden Sie beim Festlegen des Werts Variablen, die von der Aufgabe „Datei kopieren“ zurückgegeben werden. Im folgenden Beispiel wird eine Verknüpfung mit der Vorlage namens „mainTemplate.json“ hergestellt. Der Ordner mit dem Namen templates (Vorlagen) ist enthalten, da dies der Ort ist, an den die Dateikopieraufgabe die Datei kopiert hat. Geben Sie in Ihrer Pipeline den Pfad zu Ihrer Vorlage und deren Namen an.

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

Ihre Pipeline sieht wie folgt aus:

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: 'aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e'
    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'

Bei der Auswahl von Speichern wird die Buildpipeline automatisch ausgeführt. Wählen Sie unter Aufträge die Option Auftrag, um den Auftragsstatus anzuzeigen.

Nächste Schritte