Bereitstellen in App Service mithilfe von Azure Pipelines
Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019
Hinweis
Ab dem 1. Juni 2024 haben alle neu erstellten App Service-Apps die Möglichkeit, einen eindeutigen Standardhostnamen mit der Namenskonvention <app-name>-<random-hash>.<region>.azurewebsites.net
zu erstellen. Vorhandene App-Namen bleiben unverändert.
Beispiel: myapp-ds27dh7271aah175.westus-01.azurewebsites.net
Ausführlichere Informationen finden Sie unter Eindeutiger Standardhostname für App Service-Ressourcen.
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
- Ein Azure-Konto mit einem aktiven Abonnement. Sie können kostenlos ein Konto erstellen.
- Eine Azure DevOps-Organisation. Erstellen Sie ein kostenloses Konto.
- Möglichkeit zum Ausführen von Pipelines auf von Microsoft gehosteten Agents. Sie können entweder einen Parallelauftrag erwerben oder einen Free-Tarif anfordern.
- Eine funktionierende Azure App Service-App mit Code, der auf GitHub oder Azure Repos gehostet wird.
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.
Melden Sie sich bei Ihrer Azure DevOps-Organisation an, und navigieren Sie zu Ihrem Projekt.
Wechseln Sie zu Pipelines, und wählen Sie dann Neue Pipeline aus.
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.
Wenn die Liste der Repositorys angezeigt wird, wählen Sie Ihr Repository aus.
Sie werden möglicherweise zu GitHub weitergeleitet, um die Azure Pipelines-App zu installieren. Wählen Sie in diesem Fall Genehmigen & installieren aus.
Wählen Sie bei Anzeige der Registerkarte Konfigurieren die Option ASP.NET Core aus.
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
Klicken Sie am Ende der YAML-Datei, und wählen Sie dann Assistent anzeigen aus.
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.
Wählen Sie Ihr Azure-Abonnement aus. Stellen Sie sicher, dass Sie Ihre Verbindung Autorisieren. Die Autorisierung erstellt die erforderliche Dienstverbindung.
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 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:
- 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>'
- VirtualApplication: Der Name der virtuellen Anwendung, die im Azure-Portal konfiguriert wird. Weitere Informationen finden Sie unter Konfigurieren einer App Service-App im Azure-Portal.
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, wenndeployToSlotOrASE
„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:
- 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.:
- Ändern der Konfigurationseinstellungen in Webpaketen und XML-Parameterdateien
- Bereitstellen mit Web Deploy, wenn Sie mit dem IIS-Bereitstellungsprozess vertraut sind
- Bereitstellen in virtuellen Anwendungen
- Bereitstellen in anderen App-Typen, z. B. Container-Apps, Funktions-Apps, WebJobs oder API-basierten und mobilen Apps.
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
- Anpassen Ihrer Azure DevOps-Pipeline.