Bereitstellen in App Service mithilfe von Azure Pipelines

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019

Verwenden Sie Azure Pipelines, um Ihre Web-App bei jedem erfolgreichen Build automatisch in Azure App Service bereitzustellen. Mit Azure Pipelines können Sie mithilfe von Azure DevOps mit Continuous Integration (CI) und Continuous Delivery (CD) Lösungen erstellen, testen und bereitstellen.

YAML-Pipelines werden mithilfe einer YAML-Datei in Ihrem Repository definiert. Ein Schritt ist der kleinste Baustein einer Pipeline und kann ein Skript oder ein Task (vorgefertigtes Skript) sein. Erfahren Sie mehr über die wichtigsten Konzepte und Komponenten einer Pipeline.

Sie verwenden die Azure-Web-App-Aufgabe, um in Azure App Service in Ihrer Pipeline bereitzustellen. Für komplexere Szenarien, z. B. die notwendige Verwendung von XML-Parametern in Ihrer Bereitstellung, können Sie die Azure App Service-Bereitstellungsaufgabe verwenden.

Voraussetzungen

Erstellen Ihrer Pipeline

In den Codebeispielen in diesem Abschnitt wird vorausgesetzt, dass Sie eine ASP.NET-Web-App bereitstellen. Sie können die Anweisungen auf andere Frameworks anpassen.

Erfahren Sie mehr über die Unterstützung des Azure Pipelines-Ökosystems.

  1. Melden Sie sich bei Ihrer Azure DevOps-Organisation an, und navigieren Sie zu Ihrem Projekt.

  2. Wechseln Sie zu Pipelines, und wählen Sie dann Neue Pipeline aus.

  3. Führen Sie die Schritte des Assistenten aus. Wählen Sie zuerst GitHub als Speicherort Ihres Quellcodes aus.

  4. Möglicherweise werden Sie zu GitHub weitergeleitet, um sich anzumelden. Geben Sie in diesem Fall Ihre Anmeldeinformationen für GitHub ein.

  5. Wenn die Liste der Repositorys angezeigt wird, wählen Sie Ihr Repository aus.

  6. Sie werden möglicherweise zu GitHub weitergeleitet, um die Azure Pipelines-App zu installieren. Wählen Sie in diesem Fall Genehmigen und installieren aus.

  7. Wählen Sie bei Anzeige der Registerkarte Konfigurieren die Option ASP.NET Core aus.

  8. Wenn Ihre neue Pipeline angezeigt wird, sehen Sie sich den YAML-Code an, um herauszufinden, was er macht. Wenn Sie so weit sind, wählen Sie Speichern und ausführen aus.

Hinzufügen der Azure-Web-App-Aufgabe

  1. Verwenden Sie den Aufgaben-Assistenten, um die Azure-Web-App-Aufgabe hinzuzufügen.

    Screenshot der Azure-Web-App-Aufgabe.

  2. Wählen Sie Azure Resource Manager als Verbindungstyp aus, und wählen Sie Ihr Azure-Abonnement aus. Stellen Sie sicher, dass Sie Ihre Verbindung Autorisieren.

  3. Wählen Sie Web-App unter Linux aus, und geben Sie azureSubscription, appName und package ein. Ihr vollständiger YAML-Code sollte wie folgt aussehen.

  4. Wählen Sie Web-App unter Linux aus, und geben Sie azureSubscription, appName und package ein. Ihr vollständiger YAML-Code sollte wie folgt aussehen.

    variables:
      buildConfiguration: 'Release'
    
    steps:
    - script: dotnet build --configuration $(buildConfiguration)
      displayName: 'dotnet build $(buildConfiguration)'
    - task: DotNetCoreCLI@2
      inputs:
        command: 'publish'
        publishWebProjects: true
    - task: AzureWebApp@1
      inputs:
        azureSubscription: '<Azure service connection>'
        appType: 'webAppLinux'
        appName: '<Name of web app>'
        package: '$(System.DefaultWorkingDirectory)/**/*.zip'
    
    • azureSubscription: Ihr Azure-Abonnement.
    • appName: der Name Ihres vorhandenen APP Service.
    • package: der Dateipfad zum Paket oder einem Ordner mit Ihrem App-Service-Inhalt. Platzhalter werden unterstützt.

Jetzt sind Sie bereit, den Rest dieses Themas zu lesen, um einige der häufigeren Änderungen kennenzulernen, die Personen vornehmen, um eine Azure-Web-App-Bereitstellung anzupassen.

Verwenden der Azure-Web-App-Aufgabe

Die Azure-Web-App-Bereitstellungsaufgabe ist die einfachste Möglichkeit zum Bereitstellen einer Azure-Web-App. Standardmäßig erfolgt Ihre Bereitstellung in der Stammanwendung in der Azure-Web-App.

Mit der Azure App Service-Bereitstellungsaufgabe können Sie Konfigurationseinstellungen in Webpaketen und XML-Parameterdateien ändern.

Bereitstellen eines Web Deploy-Pakets

Um ein Web Deploy-ZIP-Paket (z. B. von einer ASP.NET-Web-App) in einer Azure-Web-App bereitzustellen, fügen Sie Ihrer Datei azure-pipelines.yml den folgenden Codeausschnitt hinzu:

- task: AzureWebApp@1
  inputs:
    azureSubscription: '<Azure service connection>'
    appName: '<Name of web app>'
    package: $(System.DefaultWorkingDirectory)/**/*.zip    
  • azureSubscription: Ihr Azure-Abonnement.
  • appName: der Name Ihres vorhandenen APP Service.
  • package: der Dateipfad zum Paket oder einem Ordner mit Ihrem App-Service-Inhalt. Platzhalter werden unterstützt.

Im Codeausschnitt wird davon ausgegangen, dass die Buildschritte in Ihrer YAML-Datei das ZIP-Archiv im $(System.DefaultWorkingDirectory)-Ordner auf Ihrem Agent erzeugen.

Informationen zu Azure-Dienstverbindungen finden Sie im folgenden Abschnitt.

Bereitstellen einer .NET-App

Wenn Sie eine .NET Core-App erstellen, verwenden Sie den folgenden Codeausschnitt, um den Build in einer App bereitzustellen.

variables:
  buildConfiguration: 'Release'

steps:
- script: dotnet build --configuration $(buildConfiguration)
  displayName: 'dotnet build $(buildConfiguration)'
- task: DotNetCoreCLI@2
  inputs:
    command: 'publish'
    publishWebProjects: true
- task: AzureWebApp@1
  inputs:
    azureSubscription: '<Azure service connection>'
    appType: 'webAppLinux'
    appName: '<Name of web app>'
    package: '$(System.DefaultWorkingDirectory)/**/*.zip'
  • azureSubscription: Ihr Azure-Abonnement.
  • appType: Ihr Web-App-Typ.
  • appName: der Name Ihres vorhandenen APP Service.
  • package: der Dateipfad zum Paket oder einem Ordner mit Ihrem App-Service-Inhalt. Platzhalter werden unterstützt.

Verwenden einer Dienstverbindung

Um in Azure App Service bereitzustellen, müssen Sie eine Azure Resource Manager-Dienstverbindung verwenden. Die Azure-Dienstverbindung speichert die Anmeldeinformationen, um eine Verbindung aus Azure Pipelines oder Azure DevOps Server mit Azure herzustellen.

Weitere Informationen zu Azure Resource Manager-Dienstverbindungen. Wenn Ihre Dienstverbindung nicht wie erwartet funktioniert, finden Sie Informationen unter Problembehandlung von Dienstverbindungen.

Sie benötigen eine Azure-Dienstverbindung für die AzureWebApp-Aufgabe. Die Azure-Dienstverbindung speichert die Anmeldeinformationen für die Verbindung von Azure Pipelines mit Azure. Siehe Erstellen einer Azure-Dienstverbindung.

Bereitstellen in einer virtuellen Anwendung

Standardmäßig erfolgt Ihre Bereitstellung in der Stammanwendung in der Azure-Web-App. Sie können mithilfe der Eigenschaft VirtualApplication der AzureRmWebAppDeployment-Aufgabe in einer bestimmten virtuellen Anwendung bereitstellen:

- task: AzureRmWebAppDeployment@4
  inputs:
    VirtualApplication: '<name of virtual application>'

Bereitstellen in einem Slot

Sie können die Azure-Web-App so konfigurieren, dass sie mehrere Slots besitzt. Mit Slots können Sie Ihre App sicher bereitstellen und testen, bevor Sie sie Ihren Kunden zur Verfügung stellen.

Das folgende Beispiel zeigt, wie in einem Stagingslot bereitgestellt und dann zu einem Produktionsslot gewechselt wird:

- task: AzureWebApp@1
  inputs:
    azureSubscription: '<Azure service connection>'
    appType: webAppLinux
    appName: '<name of web app>'
    deployToSlotOrASE: true
    resourceGroupName: '<name of resource group>'
    slotName: staging

- task: AzureAppServiceManage@0
  inputs:
    azureSubscription: '<Azure service connection>'
    appType: webAppLinux
    WebAppName: '<name of web app>'
    ResourceGroupName: '<name of resource group>'
    SourceSlot: staging
    SwapWithProduction: true
  • azureSubscription: Ihr Azure-Abonnement.
  • appType: (optional) Verwenden Sie webAppLinux zum Bereitstellen in einer Web-App unter Linux.
  • appName: der Name Ihres vorhandenen APP Service.
  • deployToSlotOrASE: Boolesch. Bereitstellen in einem vorhandenen Bereitstellungsslot oder in einer Azure App Service-Umgebung.
  • resourceGroupName: Name der Ressourcengruppe. Erforderlich, wenn deployToSlotOrASE „true“ ist.
  • slotName: Name des Slots. Standardeinstellung ist production. Erforderlich, wenn deployToSlotOrASE „true“ ist.
  • SourceSlot: Slot, der an die Produktion gesendet wird, wenn SwapWithProduction „true“ ist.
  • SwapWithProduction: Boolesch. Den Datenverkehr des Quellslots gegen die Produktion tauschen.

Bereitstellen in mehreren Web-Apps

Sie können Aufträge in Ihrer YAML-Datei verwenden, um eine Pipeline aus Bereitstellungen einzurichten. Mithilfe von Aufträgen können Sie die Reihenfolge der Bereitstellung in mehreren Web-Apps steuern.

jobs:
- job: buildandtest
  pool:
    vmImage: ubuntu-latest
 
  steps:
  # publish an artifact called drop
  - task: PublishPipelineArtifact@1
    inputs:
      targetPath: '$(Build.ArtifactStagingDirectory)' 
      artifactName: drop
  
  # deploy to Azure Web App staging
  - task: AzureWebApp@1
    inputs:
      azureSubscription: '<Azure service connection>'
      appType: <app type>
      appName: '<name of test stage web app>'
      deployToSlotOrASE: true
      resourceGroupName: <resource group name>
      slotName: 'staging'
      package: '$(Build.ArtifactStagingDirectory)/**/*.zip'

- job: deploy
  dependsOn: buildandtest
  condition: succeeded()

  pool: 
    vmImage: ubuntu-latest  
  
  steps:
    # download the artifact drop from the previous job
  - task: DownloadPipelineArtifact@2
    inputs:
      source: 'current'
      artifact: 'drop'
      path: '$(Pipeline.Workspace)'

  - task: AzureWebApp@1
    inputs:
      azureSubscription: '<Azure service connection>'
      appType: <app type>
      appName: '<name of test stage web app>'
      resourceGroupName: <resource group name>
      package: '$(Pipeline.Workspace)/**/*.zip'

Vornehmen von Konfigurationsänderungen

Bei den meisten Sprachstapeln können App-Einstellungen und Verbindungszeichenfolgen zur Laufzeit als Umgebungsvariablen festgelegt werden.

App-Einstellungen können auch über Key Vault mithilfe von Key Vault-Referenzen aufgelöst werden.

Für ASP.NET- und ASP.NET Core-Entwickler ähnelt das Festlegen von App-Einstellungen in App Service dem Festlegen in <appSettings> in der Datei „Web.config“. Möglicherweise möchten Sie eine bestimmte Konfiguration für Ihr Web-App-Ziel anwenden, bevor Sie dort bereitstellen. Dies ist nützlich, wenn Sie denselben Build in mehreren Web-Apps in einer Pipeline bereitstellen. Wenn Ihre „Web.config“-Datei beispielsweise eine Verbindungszeichenfolge namens connectionString enthält, können Sie deren Wert vor der Bereitstellung in den einzelnen Web-Apps ändern. Dazu können Sie entweder eine „Web.config“-Transformation anwenden oder Variablen in Ihrer „Web.config“-Datei ersetzen.

Die Azure App Service-Bereitstellungsaufgabe ermöglicht Benutzern das Ändern von Konfigurationseinstellungen in Konfigurationsdateien („*.config“-Dateien) in Webpaketen und XML-Parameterdateien (parameters.xml), basierend auf dem angegebenen Stufennamen.

Hinweis

Dateitransformationen und das Ersetzen von Variablen werden auch von der separaten Dateitransformationsaufgabe zur Verwendung in Azure Pipelines unterstützt. Sie können die Dateitransformationsaufgabe verwenden, um Dateitransformationen und Variablenersetzungen auf beliebige Konfigurations- und Parameterdateien anzuwenden.

Variablenersetzung

Der folgende Codeausschnitt zeigt ein Beispiel für die Variablenersetzung:

jobs:
- job: test
  variables:
    connectionString: <test-stage connection string>
  steps:
  - task: AzureRmWebAppDeployment@4
    inputs:
      azureSubscription: '<Test stage Azure service connection>'
      WebAppName: '<name of test stage web app>'
      enableXmlVariableSubstitution: true

- job: prod
  dependsOn: test
  variables:
    connectionString: <prod-stage connection string>
  steps:
  - task: AzureRmWebAppDeployment@4
    inputs:
      azureSubscription: '<Prod stage Azure service connection>'
      WebAppName: '<name of prod stage web app>'
      enableXmlVariableSubstitution: true

Bedingtes Bereitstellen

Um dies in YAML zu bewerkstelligen, können Sie eine der folgenden Methoden verwenden:

  • Isolieren der Bereitstellungsschritte in einen separaten Auftrag und Hinzufügen einer Bedingung zu diesem Auftrag.
  • Hinzufügen einer Bedingung zum Schritt.

Im folgenden Beispiel wird gezeigt, wie Schrittbedingungen verwendet werden, um nur Builds bereitzustellen, die aus dem Mainbranch stammen:

- task: AzureWebApp@1
  condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
  inputs:
    azureSubscription: '<Azure service connection>'
    appName: '<name of web app>'

Weitere Informationen finden Sie unter Angeben von Bedingungen.

(Klassisch) Bereitstellen einer Releasepipeline

Sie können eine Releasepipeline verwenden, um die von Ihrem Build veröffentlichten Artefakte aufzunehmen und diese dann auf Ihrer Azure-Website bereitzustellen.

  1. Führen Sie eine der folgenden Aktionen aus, um mit dem Erstellen einer Releasepipeline zu beginnen:

    • Wenn Sie gerade einen CI-Build abgeschlossen haben, wählen Sie den Link aus (z. B. Build 20170815.1), um die Buildzusammenfassung zu öffnen. Wählen Sie dann Release aus, um eine neue Releasepipeline zu starten, die automatisch mit der Buildpipeline verknüpft wird.

    • Öffnen Sie die Registerkarte Releases in Azure Pipelines, öffnen Sie das +-Dropdown in der Liste der Releasepipelines, und wählen Sie Releasepipeline erstellen aus.

  2. Am einfachsten erstellen Sie eine Releasepipeline mit einer Vorlage. Wenn Sie eine Node.js-App bereitstellen, wählen Sie die Vorlage Node.js-App in Azure App Service bereitstellen aus. Wählen Sie andernfalls die Vorlage Azure App Service-Bereitstellung aus. Wählen Sie anschließend die Option Übernehmen.

    Hinweis

    Der einzige Unterschied zwischen diesen Vorlagen besteht darin, dass die Node.js-Vorlage die Aufgabe so konfiguriert, dass sie eine web.config-Datei generiert, die einen Parameter enthält, der den iisnode-Dienst startet.

  3. Wenn Sie Ihre neue Releasepipeline auf Grundlage einer Buildzusammenfassung erstellt haben, überprüfen Sie, ob die Buildpipeline und das Artefakte im Abschnitt Artefakte auf der Registerkarte Pipeline angezeigt werden. Wenn Sie eine neue Releasepipeline über die Registerkarte Releases erstellt haben, wählen Sie den Link + Hinzufügen und dann Ihr Buildartefakt aus.

  4. Wählen Sie das Symbol Continuous Deployment im Abschnitt Artefakte aus, überprüfen Sie, ob der Continuous Deployment-Trigger aktiviert ist, und fügen Sie einen Filter hinzu, um den Mainbranch einzuschließen.

    Hinweis

    Continuous Deployment ist nicht standardmäßig aktiviert, wenn Sie eine neue Releasepipeline über die Registerkarte Releases erstellen.

  5. Öffnen Sie die Registerkarte Aufgaben, und konfigurieren Sie bei ausgewählter Stufe 1 die Aufgabeneigenschaftsvariablen wie folgt:

    • Azure-Abonnement: Wählen Sie in der Liste Verfügbare Azure-Dienstverbindungen eine Verbindung aus, oder erstellen Sie eine Verbindung mit eingeschränkteren Berechtigungen für Ihr Azure-Abonnement. Wenn Sie Azure Pipelines verwenden und eine Schaltfläche Autorisieren neben der Eingabe angezeigt wird, klicken Sie darauf, um Azure Pipelines für das Verbinden mit Ihrem Azure-Abonnement zu autorisieren. Wenn Sie TFS verwenden oder das gewünschte Azure-Abonnement nicht in der Liste der Abonnements angezeigt wird, finden Sie Informationen zum manuellen Einrichten der Verbindung unter Azure Resource Manager-Dienstverbindung.

    • App Service-Name: Wählen Sie den Namen der Web-App aus Ihrem Abonnement aus.

    Hinweis

    Bei der vorlagenbasierten Erstellung einer Releasepipeline wurden einige Einstellungen für die Aufgaben unter Umständen automatisch als Stufenvariablen definiert. Diese Einstellungen können in den Aufgabeneinstellungen nicht geändert werden. Zum Bearbeiten dieser Einstellungen müssen Sie stattdessen das übergeordnete Stufenelement auswählen.

  6. Speichern Sie die Releasepipeline.

Erstellen eines Release zum Bereitstellen Ihrer App

Sie können nun ein Release erstellen, was bedeutet, die Releasepipeline mit den von einem bestimmten Build erzeugten Artefakten auszuführen. Das Ergebnis ist die Bereitstellung des Builds:

  1. Wählen Sie + Release und dann Release erstellen aus.

  2. Überprüfen Sie im Bereich Neues Release erstellen, ob die von Ihnen gewünschte Artefaktversion ausgewählt ist, und wählen Sie dann Erstellen aus.

  3. Klicken Sie in der Meldung in der Informationsleiste auf den Releaselink. Beispiel: „Release Release-1 wurde erstellt.“

  4. Wählen Sie in der Pipelineansicht den Statuslink in den Phasen der Pipeline aus, um die Protokolle und die Agentausgabe anzuzeigen.

  5. Navigieren Sie nach Abschluss des Release mithilfe der Web-App-URL http://{web_app_name}.azurewebsites.net zu Ihrer Website, die in Azure ausgeführt wird, und überprüfen Sie deren Inhalt.

Nächste Schritte