Grundlegendes zu End-to-End-Bereitstellungen

Abgeschlossen

Pipelines sind flexible Tools, die Sie auf viele verschiedene Arten konfigurieren können, damit sie Ihre Anforderungen erfüllen. In dieser Einheit lernen Sie das Bereitstellen einer Gesamtlösung mithilfe von Pipelines (einschließlich Konfiguration der Azure-Infrastruktur) kennen und erfahren, wie Sie weitere Bereitstellungsvorgänge durchführen.

Wie viele Pipelines?

In einigen Organisationen unterscheidet sich das Team, das die Azure-Umgebung verwaltet, von dem Team, das den Code entwickelt, der in der Umgebung ausgeführt wird. In diesen Situationen ist es oft verlockend, mehrere Pipelines zu erstellen, die sich jeweils im Besitz des Teams befinden, das für den jeweiligen Bereich verantwortlich ist. Beispielsweise können Sie eine Pipeline erstellen, um den Bicep-Code bereitzustellen, der die Azure-Ressourcen Ihrer Website bereitstellt, und eine andere Pipeline, die die Websiteanwendung bereitstellt.

Obwohl dieser Ansatz Ihnen ein gewisses Maß an Flexibilität bei der Verwaltung der Pipelines bieten kann, kann es schwierig sein, alles synchron zu halten. Angenommen, Ihr Websiteteam benötigt eine neue Einstellung für seine Azure App Service-App, um ein Feature zu aktivieren, das es erstellt. Die Anwendungsbereitstellungspipeline kann erst ausgeführt werden, wenn die Infrastrukturbereitstellungspipeline erfolgreich abgeschlossen wird. Außerdem kann es kompliziert werden, Daten, z. B. die Namen von Azure-Ressourcen, die von Ihrer Infrastrukturpipeline erstellt werden, zwischen den Pipelines zu senden.

Stattdessen ist es häufig besser, eine einzelne Pipeline zu erstellen, die alle erforderlichen Komponenten für Ihre Lösung bereitstellt, auch wenn die Komponenten von verschiedenen Personen oder Teams verwaltet werden. Sie können Tools wie Git und Azure DevOps verwenden, um Ihre Arbeit zu koordinieren. Wenn ein neues Feature hinzugefügt wird, können Sie einen Branch verwenden, um die erforderlichen Änderungen an Ihrer Bicep-Datei vorzunehmen. Wenn die Änderung integriert und freigegeben werden kann, führt eine einzelne Pipeline alle erforderlichen Schritte aus, um die Lösung zu erstellen und bereitzustellen. Eine einzelne Pipeline verringert die Wahrscheinlichkeit, dass Vorgänge nicht synchron ausgeführt werden.

Tipp

Wenn Sie Code für Ihre Lösung erstellen, müssen Sie ihn wahrscheinlich häufig bereitstellen, damit Sie die Funktionsweise testen können. Möglicherweise stellen Sie fest, dass die Bereitstellung Ihrer Infrastruktur zusammen mit Ihrem Anwendungscode dazu führen kann, dass Ihre Pipeline langsam ausgeführt wird und Ihren Fortschritt hemmt.

Wenn Sie sich in dieser Lage befinden, können Sie erwägen, die Infrastrukturbereitstellung für Ihre Entwicklungsumgebung zu deaktivieren. Hierzu können Sie Pfadfilter, Pipelinevorlagen und Bedingungen verwenden. Sie sollten jedoch die vollständige Bereitstellungssequenz für Ihre anderen Umgebungen intakt lassen.

Steuerungsebene und Datenebene

Viele Azure-Ressourcen bieten zwei verschiedene Ebenen für den Zugriff. Auf der Steuerungsebene wird die Ressource bereitgestellt und konfiguriert. Auf der Datenebene können Sie auf die Funktionen der Ressource zugreifen.

Wenn Sie Bicep-Dateien erstellen und bereitstellen, interagieren Sie mit der Steuerungsebene. In Azure ist Azure Resource Manager die Steuerungsebene. Sie verwenden Resource Manager, um die Konfiguration der einzelnen Ressourcen zu definieren.

Ihre Pipeline muss jedoch häufig mehr Aktionen ausführen, als nur mit der Steuerungsebene zu interagieren. Beispielsweise müssen Sie möglicherweise andere Aufgaben ausführen:

  • Hochladen eines Blobs in ein Speicherkonto.
  • Ändern eines Datenbankschemas.
  • Aufrufen einer API für einen Drittanbieterdienst.
  • Auslösen eines Updates eines Machine Learning-Modells.
  • Bereitstellen einer Website für eine Azure App Service-App.
  • Bereitstellen von Software auf einer VM.
  • Registrieren Sie einen DNS-Eintrag (Domänennamenserver) bei einem Drittanbieter.

Wenn Sie eine End-to-End-Pipeline in Betracht ziehen, müssen Sie normalerweise Ihre Azure-Ressourcen bereitstellen und dann eine Reihe von Vorgängen für die Datenebenen dieser Ressourcen ausführen. Gelegentlich werden diese Vorgänge als letzte Meile der Bereitstellung bezeichnet, da Sie den Großteil der Bereitstellung mithilfe der Steuerungsebene durchführen und nur wenige Konfigurationsschritte verbleiben.

Hinweis

Einige Ressourcen weisen keine klare Trennung zwischen ihrer Steuerungsebene und der Datenebene auf. Dazu gehören Azure Data Factory und Azure API Management. Beide Dienste unterstützen vollständig automatisierte Bereitstellungen mithilfe von Bicep, erfordern jedoch besondere Überlegungen. Links zu weiteren Informationen finden Sie auf der Seite „Zusammenfassung“ am Ende des Moduls.

Ausführen von Datenebenenvorgängen

Wenn Sie eine Bereitstellungspipeline erstellen, die mit der Datenebene Ihrer Ressourcen interagiert, können Sie einen der drei folgenden gängigen Ansätze verwenden:

  • Resource Manager-Bereitstellungsskripts
  • Pipelineskripts
  • Pipelineaufgaben

Resource Manager-Bereitstellungsskripts werden in Ihrer Bicep-Datei definiert. Sie führen Bash- oder PowerShell-Skripts aus und können mit der Azure CLI oder Azure PowerShell-Cmdlets interagieren. Sie erstellen eine verwaltete Identität, damit sich das Bereitstellungsskript bei Azure authentifizieren kann. Azure stellt automatisch die anderen Ressourcen bereit, die zum Ausführen des Bereitstellungsskripts benötigt werden, und verwaltet sie.

Bereitstellungsskripts eignen sich gut, wenn Sie ein einfaches Skript in Ihrem Bereitstellungsprozess ausführen müssen. Sie bieten Ihnen jedoch nicht einfach Zugriff auf andere Elemente aus Ihrer Pipeline.

Sie können auch ihre eigene Logik innerhalb einer Bereitstellungspipeline ausführen. Azure Pipelines bietet ein umfangreiches Ökosystem von Aufgaben für allgemeine Schritte, die Sie durchführen müssen. Wenn Sie keine Aufgabe finden, die Ihren Anforderungen entspricht, können Sie ein Skript verwenden, um Ihren eigenen Bash- oder PowerShell-Code auszuführen. Pipelinetasks und Skripts werden über den Agent Ihrer Pipeline ausgeführt. Häufig müssen Sie die Aufgabe oder das Skript auf der Datenebene des von Ihnen verwendeten Diensts authentifizieren. Wie Sie dabei vorgehen, hängt vom Dienst ab.

Pipelinetasks und Skripts bieten Ihnen Flexibilität und Kontrolle. Sie ermöglichen Ihnen auch den Zugriff auf Pipelineartefakte, die Sie in Kürze kennenlernen werden. In diesem Modul konzentrieren wir uns auf Pipelineskripts und -aufgaben. Links zu weiteren Informationen über Resource Manager-Bereitstellungsskripts finden Sie auf der Seite „Zusammenfassung“ am Ende des Moduls.

Ausgaben

Eine Pipeline erstellt und konfiguriert normalerweise Ihre Azure-Ressourcen, indem eine Bicep-Datei bereitgestellt wird. Die nachfolgenden Teile der Pipeline interagieren dann mit der Datenebene dieser Ressourcen. Damit sie mit den Ressourcen interagieren können, benötigen die Pipelineaufgaben und -schritte Informationen über die erstellte Azure-Ressource.

Angenommen, Sie verfügen über eine Bicep-Datei, die ein Speicherkonto bereitstellt. Sie möchten, dass Ihre Pipeline das Speicherkonto bereitstellt und dann einige Blobs in einen Blobcontainer im Speicherkonto hochlädt. Die Pipelineaufgabe, die die Blobs hochlädt, muss den Namen des Speicherkontos kennen, mit dem eine Verbindung hergestellt werden soll, sowie den Namen des Blobcontainers, in den die Datei hochgeladen werden soll.

Es ist eine bewährte Methode, dass die Bicep-Datei über die Namen Ihrer Azure-Ressourcen entscheidet. Sie kann Parameter, Variablen oder Ausdrücke verwenden, um die Namen für das Speicherkonto und den Blobcontainer zu erstellen. Die Bicep-Datei kann dann eine Ausgabe verfügbar machen, die den Namen der einzelnen Ressourcen bereitstellt. Spätere Schritte in der Pipeline können den Wert der Ausgabe lesen. Auf diese Weise muss Ihre Pipelinedefinition keine Namen oder andere Informationen hart codieren, die sich zwischen Umgebungen ändern können. Außerdem muss die Definition nicht auf Regeln basieren, die in Ihrer Bicep-Datei definiert sind.

Mit Azure Pipelines können Sie die Werte von Ausgaben mithilfe von Pipelinevariablen weitergeben. Sie können den Wert einer Pipelinevariablen in einem Pipelineskript festlegen. Sie verwenden eine speziell formatierte Protokollausgabe, die Azure Pipelines interpretieren kann, wie hier gezeigt:

stages:
- stage: Stage1
  jobs:
  - job: Job1
    steps:
      # Set the variable's value.
      - script: |
          echo "##vso[task.setvariable variable=myVariableName;isOutput=true]VariableValue"
        name: Step1

      # Read the variable's value.
      - script:
          echo $(myVariableName)

Wenn Sie eine Variable in einem Auftrag erstellen und in einem anderen in derselben Phase darauf zugreifen möchten, müssen Sie sie zuordnen.

stages:
- stage: Stage2
  jobs:
  - job: Job2
    steps:
      # Set the variable's value.
      - script: |
          echo "##vso[task.setvariable variable=myVariableName;isOutput=true]VariableValue"
        name: Step1

  - job: Job3
    dependsOn: Job2
    variables: # Map the variable to this job.
      myVariableName: $[ dependencies.Job2.outputs['Step1.myVariableName'] ]
    steps:
      # Read the variable's value.
      - script: |
          echo $(myVariableName)

Um über Pipelinephasen hinweg auf eine Variable zuzugreifen, müssen Sie die Variable ebenfalls zuordnen, unter Verwendung einer anderen Syntax:

stages:
- stage: Stage2
  jobs:
  - job: Job2
    steps:
      # Set the variable's value.
      - script: |
          echo "##vso[task.setvariable variable=myVariableName;isOutput=true]VariableValue"
        name: Step1

  - job: Job3
    dependsOn: Job2
    variables: # Map the variable to this job.
      myVariableName: $[ dependencies.Job2.outputs['Step1.myVariableName'] ]
    steps:
      # Read the variable's value.
      - script: |
          echo $(myVariableName)

- stage: Stage3
  dependsOn: Stage2
  jobs:
  - job: Job4
    variables: # Map the variable to this stage.
      myVariableName: $[ stageDependencies.Stage2.Job2.outputs['Step1.myVariableName'] ]
    steps:
      # Read the variable's value.
    - script: |
        echo $(myVariableName)

Mithilfe von Bicep-Ausgaben und Pipelinevariablen können Sie eine mehrstufige Pipeline erstellen, die Ihren Bicep-Code bereitstellt und dann im Rahmen ihrer Bereitstellung verschiedene Aktionen für die Ressourcen ausführt.