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 (AzureWebApp), 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 (AzureRmWebAppDeployment) verwenden.

Voraussetzungen

1. Erstellen einer Pipeline für den Stapel

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. Wenn Sie dazu aufgefordert werden, wählen Sie den Speicherort Ihres Quellcodes aus: entweder Azure Repos Git oder GitHub.

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

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

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

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

  7. 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.

2. Hinzufügen der Bereitstellungsaufgabe

  1. Klicken Sie am Ende der YAML-Datei, und wählen Sie dann Assistent anzeigen aus.

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

    Screenshot of Azure web app task.

    Alternativ können Sie die Azure App Service-Bereitstellungsaufgabe (AzureRmWebAppDeployment) hinzufügen.

  3. Wählen Sie Ihr Azure-Abonnement aus. Stellen Sie sicher, dass Sie Ihre Verbindung Autorisieren. Die Autorisierung erstellt die erforderliche Dienstverbindung.

  4. Wählen Sie App-Typ, App-Nameund Runtimestapel basierend auf Ihrer App Service-App aus. Die vollständige YAML-Datei sollte dem folgenden Code ähneln:

    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: '<service-connection-name>'
        appType: 'webAppLinux'
        appName: '<app-name>'
        package: '$(System.DefaultWorkingDirectory)/**/*.zip'
    
    • azureSubscription: Name der autorisierten Dienstverbindung mit Ihrem Azure-Abonnement
    • appName: Name der vorhandenen App
    • package: Dateipfad zum Paket oder Ordner, das bzw. der die App-Dienstinhalte enthält. Platzhalter werden unterstützt.

Beispiel: Bereitstellen einer .NET-App

Um ein ZIP-Webpaket (z. B. von einer ASP.NET-Web-App) in einer Azure-Web-App bereitzustellen, verwenden Sie den folgenden Codeschnipsel, 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: '<service-connection-name>'
    appType: 'webAppLinux'
    appName: '<app-name>'
    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.

Beispiel: 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 Azure App Service-Bereitstellungsaufgabe (AzureRmWebAppDeployment) in einer bestimmten virtuellen Anwendung bereitstellen:

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

Beispiel: Bereitstellen in einem Slot

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

- task: AzureWebApp@1
  inputs:
    azureSubscription: '<service-connection-name>'
    appType: webAppLinux
    appName: '<app-name>'
    deployToSlotOrASE: true
    resourceGroupName: '<name of resource group>'
    slotName: staging
    package: '$(Build.ArtifactStagingDirectory)/**/*.zip'

- task: AzureAppServiceManage@0
  inputs:
    azureSubscription: '<service-connection-name>'
    appType: webAppLinux
    WebAppName: '<app-name>'
    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.
  • package: der Dateipfad zum Paket oder einem Ordner mit Ihrem App-Service-Inhalt. Platzhalter werden unterstützt.
  • SourceSlot: Slot, der an die Produktion gesendet wird, wenn SwapWithProduction „true“ ist.
  • SwapWithProduction: Boolesch. Den Datenverkehr des Quellslots gegen die Produktion tauschen.

Beispiel: 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: '<service-connection-name>'
      appType: <app type>
      appName: '<staging-app-name>'
      deployToSlotOrASE: true
      resourceGroupName: <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: '<service-connection-name>'
      appType: <app type>
      appName: '<production-app-name>'
      resourceGroupName: <group-name>
      package: '$(Pipeline.Workspace)/**/*.zip'

Beispiel: Vornehmen von Variablenersetzungen

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

Es gibt jedoch andere Gründe, aus denen Sie Variablenersetzungen für Web.config vornehmen sollten. In diesem Beispiel enthält die Datei „Web.config“ eine Verbindungszeichenfolge mit dem Namen connectionString. Sie können den Wert ändern, bevor Sie sie für jede Web-App bereitstellen. Dazu können Sie entweder eine „Web.config“-Transformation anwenden oder Variablen in Ihrer „Web.config“-Datei ersetzen.

Der folgende Codeschnipsel zeigt ein Beispiel für die Variablenersetzung mithilfe der Azure App Service-Bereitstellungsaufgabe (AzureRmWebAppDeployment):

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

Beispiel: Bedingte Bereitstellung

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: '<service-connection-name>'
    appName: '<app-name>'

Weitere Informationen finden Sie unter Angeben von Bedingungen.

Beispiel: Bereitstellen mithilfe von Web Deploy

Die Azure App Service-Bereitstellungsaufgabe (AzureRmWebAppDeployment) kann mithilfe von Web Deploy in App Service bereitgestellt werden.

trigger:
- main

pool:
  vmImage: windows-latest

variables:
  buildConfiguration: 'Release'

steps:
- script: dotnet build --configuration $(buildConfiguration)
  displayName: 'dotnet build $(buildConfiguration)'
- task: DotNetCoreCLI@2
  inputs:
    command: 'publish'
    publishWebProjects: true
    arguments: '--configuration $(buildConfiguration)'
    zipAfterPublish: true
- task: AzureRmWebAppDeployment@4
  inputs:
    ConnectionType: 'AzureRM'
    azureSubscription: '<service-connection-name>'
    appType: 'webApp'
    WebAppName: '<app-name>'
    packageForLinux: '$(System.DefaultWorkingDirectory)/**/*.zip'
    enableCustomDeployment: true
    DeploymentType: 'webDeploy'

Häufig gestellte Fragen

Die Differenz zwischen den Aufgaben AzureWebApp und AzureRmWebAppDeployment?

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

Die Azure App Service-Bereitstellungsaufgabe (AzureRmWebAppDeployment) kann weitere benutzerdefinierte Szenarien verarbeiten, z. B.:

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.

Ich erhalte die Meldung „Ungültiges App Service-Paket oder ungültiger Ordnerpfad angegeben.“

In YAML-Pipelines gibt es je nach Pipeline möglicherweise einen Konflikt zwischen dem Speicherort des erstellten Webpakets und dem Ort, an dem die Bereitstellungsaufgabe danach sucht. Die Aufgabe AzureWebApp nimmt beispielsweise das Webpaket für die Bereitstellung auf. Die AzureWebApp-Aufgabe sucht z. B. unter $(System.DefaultWorkingDirectory)/**/*.zip. Wenn sich das Webpaket an anderer Stelle befindet, ändern Sie den Wert von package.

Ich erhalte die Meldung „Eine Veröffentlichung unter Verwendung von webdeploy-Optionen wird nur unterstützt, wenn der Windows-Agent verwendet wird.“.

Dieser Fehler tritt in der Aufgabe AzureRmWebAppDeployment auf, wenn Sie die Aufgabe für die Bereitstellung mithilfe von Web Deploy konfigurieren, Ihr Agent jedoch Windows nicht ausführt. Stellen Sie sicher, dass Ihr YAML-Code mit dem folgenden Code vergleichbar ist:

pool:
  vmImage: windows-latest

Web Deploy funktioniert nicht, wenn ich die Standardauthentifizierung deaktiviere.

Informationen zur Fehlerbehebung, damit die Microsoft Entra ID-Authentifizierung mit der Aufgabe AzureRmWebAppDeployment funktioniert, finden Sie unter Ich kann keine Webbereitstellung für meine Azure App Service mit Microsoft Entra ID-Authentifizierung über meinen Windows-Agent ausführen..

Nächste Schritte