Freigeben über


Bereitstellen in Azure 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 eine kontinuierliche Integration und kontinuierliche Bereitstellung (CI/CD) 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 kompliziertere Szenarien, z. B. wenn Sie XML-Parameter in Ihrer Bereitstellung verwenden müssen, können Sie die Azure App Service-Bereitstellungsaufgabe AzureRmWebAppDeploymentverwenden.

Voraussetzungen:

1. Erstelle eine Pipeline für deinen Stack

In den Codebeispielen in diesem Abschnitt wird davon ausgegangen, 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 wechseln Sie zu Ihrem Projekt.

  2. Wechseln Sie zu "Pipelines ", und wählen Sie "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. Wählen Sie das Ende der YAML-Datei und dann den Assistenten anzeigen aus.

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

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

  3. Wählen Sie Ihr Azure-Abonnement aus. Wählen Sie "Autorisieren" aus, um Ihre Verbindung zu 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:
    - 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 Ihrer vorhandenen App.
    • package: Dateipfad zum Paket oder einem Ordner, der Ihren App Service-Inhalt 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:
- 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-Diensts.
  • package: Dateipfad zum Paket oder einem Ordner, der Ihren App Service-Inhalt enthält. Platzhalter werden unterstützt.

Beispiel: Bereitstellen in einer virtuellen Anwendung

Standardmäßig erfolgt Ihre Bereitstellung mit der Stammanwendung in der Azure Web App. Sie können eine bestimmte virtuelle Anwendung bereitstellen, indem Sie die VirtualApplication Eigenschaft der Azure App Service-Bereitstellungsaufgabe AzureRmWebAppDeploymentverwenden:

- 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-Diensts.
  • 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: Dateipfad zum Paket oder einem Ordner, der Ihren App Service-Inhalt enthält. Platzhalter werden unterstützt.
  • SourceSlot: Slot, der an die Produktion gesendet wird, wenn „true“ für SwapWithProduction angegeben 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: Bedingte Bereitstellung

Zum bedingten Bereitstellen in YAML können Sie eine der folgenden Techniken 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 auf App Service bereitgestellt werden.

trigger:
- main

pool:
  vmImage: windows-latest

variables:
  buildConfiguration: 'Release'

steps:
- 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

Was ist der Unterschied zwischen den Aufgaben AzureWebApp und AzureRmWebAppDeployment?

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

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

Hinweis

Die separate Dateitransformationsaufgabe unterstützt sowohl Dateitransformationen als auch Variablen-Ersetzungen für die Verwendung in Azure Pipelines. Sie können die Dateitransformationsaufgabe verwenden, um Dateitransformationen und Variablenersetzungen auf alle Konfigurations- und Parameterdateien anzuwenden.

Warum erhalte ich die Meldung "Ungültiges App Service-Paket oder Ordnerpfad bereitgestellt"?

In YAML-Pipelines kann es je nach Ihrer Pipeline zu einer Diskrepanz zwischen dem Speicherort des erstellten Webpakets und dem Ort kommen, an dem die Bereitstellungsaufgabe danach sucht. Die Aufgabe AzureWebApp übernimmt beispielsweise das Web-Paket zur Bereitstellung. Die Aufgabe AzureWebApp sucht möglicherweise in $(System.DefaultWorkingDirectory)/**/*.zip. Wenn sich das Webpaket an anderer Stelle befindet, ändern Sie den Wert von package.

Warum erhalte ich die Meldung "Veröffentlichen mithilfe von Webdeploy-Optionen werden nur bei Verwendung des Windows-Agents unterstützt"?

Dieser Fehler tritt in der AzureRmWebAppDeployment Aufgabe auf, wenn Sie die Aufgabe für die Bereitstellung mithilfe von Web Deploy konfigurieren, aber Ihr Agent führt Windows nicht aus. Vergewissern Sie sich, dass Ihr YAML einen ähnlichen Code wie den folgenden Code enthält:

pool:
  vmImage: windows-latest

Warum funktioniert web Deploy 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 in Azure App Service mithilfe der Microsoft Entra ID-Authentifizierung über meinen Windows-Agent ausführen..