Freigeben über


Continuous Delivery mit Azure Pipelines

Verwenden Sie Azure Pipelines , um Ihr Codeprojekt automatisch in einer Funktions-App in Azure 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 AzureFunctionApp Aufgabe, um Ihren Code bereitzustellen. Es gibt jetzt zwei Versionen von AzureFunctionApp, die in dieser Tabelle verglichen werden:

Vergleich/Version AzureFunctionApp@2 AzureFunctionApp@1
Unterstützt den Flex-Verbrauchsplan
Umfasst erweiterte Überprüfungsunterstützung*
Wann verwendet werden soll... Empfohlen für neue App-Bereitstellungen Wartung für ältere Deployments

* Die erweiterte Überprüfungsunterstützung führt dazu, dass Pipelines aufgrund von Fehlern weniger wahrscheinlich fehlschlagen.

Wählen Sie oben im Artikel Ihre Taskversion aus.

Hinweis

Upgrade von AzureFunctionApp@1 auf AzureFunctionApp@2 um Zugriff auf neue Features und langfristigen Support zu erhalten.

Voraussetzungen

Erstellen der App

  1. Melden Sie sich bei Ihrer Azure DevOps-Organisation an, und navigieren Sie zu Ihrem Projekt.
  2. Navigieren Sie in Ihrem Projekt zur Seite Pipelines. Wählen Sie dann die Aktion zum Erstellen einer neuen 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 Beispiel-App-Repository aus.
  6. Azure Pipelines analysiert Ihr Repository und empfiehlt eine Vorlage. Klicken Sie auf Speichern und ausführen, wählen Sie Direkten Commit an Mainbranch ausführen aus, und klicken Sie dann erneut auf Speichern und ausführen.
  7. Eine neue Ausführung wird gestartet. Warten Sie, bis die Ausführung beendet ist.

Beispiel-YAML-Buildpipelines

Die folgenden sprachspezifischen Pipelines können zum Erstellen von Apps verwendet werden.

Sie können die YAML-Datei zum Erstellen einer .NET-App mithilfe des folgenden Beispiels erstellen:

pool:
  vmImage: 'windows-latest'
steps:
  - task: UseDotNet@2
    displayName: 'Install .NET 8.0 SDK'
    inputs:
      packageType: 'sdk'
      version: '8.0.x'
      installationPath: $(Agent.ToolsDirectory)/dotnet
  - script: |
      dotnet restore
      dotnet build --configuration Release
  - task: DotNetCoreCLI@2
    displayName: 'dotnet publish'
    inputs:
      command: publish
      arguments: '--configuration Release --output $(System.DefaultWorkingDirectory)/publish_output'
      projects: 'csharp/*.csproj'
      publishWebProjects: false
      modifyOutputPath: false
      zipAfterPublish: false
  - task: ArchiveFiles@2
    displayName: "Archive files"
    inputs:
      rootFolderOrFile: "$(System.DefaultWorkingDirectory)/publish_output"
      includeRootFolder: false
      archiveFile: "$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip"
  - task: PublishBuildArtifacts@1
    inputs:
      PathtoPublish: '$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip'
      artifactName: 'drop'
  1. Melden Sie sich bei Ihrer Azure DevOps-Organisation an, und navigieren Sie zu Ihrem Projekt.
  2. Navigieren Sie in Ihrem Projekt zur Seite Pipelines. Wählen Sie dann Neue Pipeline aus.
  3. Wählen Sie eine der folgenden Optionen für Wo befindet sich Ihr Code?:
    • GitHub:Möglicherweise werden Sie zu GitHub weitergeleitet, um sich anzumelden. Geben Sie in diesem Fall Ihre Anmeldeinformationen für GitHub ein. Wenn dies Ihre erste Verbindung mit GitHub ist, führt der Assistent Sie auch durch den Prozess der Verbindung von DevOps mit Ihren GitHub-Konten.
    • Azure Repos Git: Sie können sofort ein Repository in Ihrem aktuellen DevOps-Projekt auswählen.
  4. Wenn die Liste der Repositorys angezeigt wird, wählen Sie Ihr Beispiel-App-Repository aus.
  5. Azure Pipelines analysiert Ihr Repository und stellt in Pipeline konfigurieren eine Liste potenzieller Vorlagen bereit. Wählen Sie die entsprechende Funktions-App-Vorlage für Ihre Sprache aus. Wenn die richtige Vorlage nicht angezeigt wird, wählen Sie Mehr anzeigen aus.
  6. Klicken Sie auf Speichern und ausführen, wählen Sie Direkten Commit an Mainbranch ausführen aus, und klicken Sie dann erneut auf Speichern und ausführen.
  7. Eine neue Ausführung wird gestartet. Warten Sie, bis die Ausführung beendet ist.

Beispiel-YAML-Buildpipelines

Die folgenden sprachspezifischen Pipelines können zum Erstellen von Apps verwendet werden.

Sie können das folgende Beispiel verwenden, um eine YAML-Datei zum Erstellen einer .NET-App zu erstellen.

Wenn beim Erstellen Ihrer App Fehler angezeigt werden, überprüfen Sie, ob die verwendete .NET-Version mit Ihrer Azure Functions-Version übereinstimmt. Weitere Informationen finden Sie unter Einstellen von Runtimeversionen von Azure Functions als Ziel.

pool:
  vmImage: 'windows-latest'
steps:
  - task: UseDotNet@2
    displayName: 'Install .NET 8.0 SDK'
    inputs:
      packageType: 'sdk'
      version: '8.0.x'
      installationPath: $(Agent.ToolsDirectory)/dotnet
  - script: |
      dotnet restore
      dotnet build --configuration Release
  - task: DotNetCoreCLI@2
    displayName: 'dotnet publish'
    inputs:
      command: publish
      arguments: '--configuration Release --output $(System.DefaultWorkingDirectory)/publish_output'
      projects: 'csharp/*.csproj'
      publishWebProjects: false
      modifyOutputPath: false
      zipAfterPublish: false
  - task: ArchiveFiles@2
    displayName: "Archive files"
    inputs:
      rootFolderOrFile: "$(System.DefaultWorkingDirectory)/publish_output"
      includeRootFolder: false
      archiveFile: "$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip"
  - task: PublishBuildArtifacts@1
    inputs:
      PathtoPublish: '$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip'
      artifactName: 'drop'

Bereitstellen Ihrer App

Ihre Bereitstellung erfolgt mit dem Task Azure-Funktions-App-Bereitstellung v2. Diese Aufgabe erfordert eine Azure-Dienstverbindung als Eingabe. Eine Azure-Dienstverbindung speichert die Anmeldeinformationen für die Verbindung von Azure Pipelines mit Azure. Sie sollten eine Verbindung erstellen, die den Workload-Identitätsverbund verwendet.

Um sie in Azure Functions bereitzustellen, fügen Sie diesen Codeausschnitt am Ende Ihrer azure-pipelines.yml Datei hinzu, je nachdem, ob Ihre App unter Linux oder Windows ausgeführt wird:

trigger:
- main

variables:
  # Azure service connection established during pipeline creation
  azureSubscription: <Name of your Azure subscription>
  appName: <Name of the function app>
  # Agent VM image name
  vmImageName: 'windows-latest'

- task: AzureFunctionApp@2 # Add this at the end of your file
  inputs:
    azureSubscription: <Name of your Azure subscription>
    appType: functionApp # this specifies a Windows-based function app
    appName: $(appName)
    package: $(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip
    deploymentMethod: 'auto' # 'auto' | 'zipDeploy' | 'runFromPackage'. Required. Deployment method. Default: auto.
    #Uncomment the next lines to deploy to a deployment slot
    #Note that deployment slots is not supported for Linux Dynamic SKU
    #deployToSlotOrASE: true
    #resourceGroupName: '<RESOURCE_GROUP>'
    #slotName: '<SLOT_NAME>'

Der Standardwert appType ist Windows (functionApp). Sie können „Linux“ angeben, indem Sie appType auf functionAppLinux festlegen. Eine Flex-Verbrauch-App wird unter Linux ausgeführt, und Sie müssen sowohl appType: functionAppLinux als auch isFlexConsumption: true festlegen.

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

Sie stellen die Bereitstellung mithilfe der Azure Function App Deploy-Aufgabe bereit . Diese Aufgabe erfordert eine Azure-Dienstverbindung als Eingabe. Eine Azure-Dienstverbindung speichert die Anmeldeinformationen für die Verbindung von Azure Pipelines mit Azure.

Von Bedeutung

Die Bereitstellung für eine Flex Consumption-App wird nicht durch die Aufgabe AzureFunctionApp@v1 unterstützt.

Um sie in Azure Functions bereitzustellen, fügen Sie diesen Codeausschnitt am Ende Ihrer azure-pipelines.yml Datei hinzu:

trigger:
- main

variables:
  # Azure service connection established during pipeline creation
  azureSubscription: <Name of your Azure subscription>
  appName: <Name of the function app>
  # Agent VM image name
  vmImageName: 'ubuntu-latest'

- task: DownloadBuildArtifacts@1 # Add this at the end of your file
  inputs:
    buildType: 'current'
    downloadType: 'single'
    artifactName: 'drop'
    itemPattern: '**/*.zip'
    downloadPath: '$(System.ArtifactsDirectory)'
- task: AzureFunctionApp@1
  inputs:
    azureSubscription: $(azureSubscription)
    appType: functionAppLinux # default is functionApp
    appName: $(appName)
    package: $(System.ArtifactsDirectory)/**/*.zip

Dieser Codeausschnitt setzt appType auf functionAppLinux, was erforderlich ist, wenn in einer App bereitgestellt wird, die unter Linux läuft. Der Standardwert appType ist Windows (functionApp).

Im Beispiel wird davon ausgegangen, dass die Buildschritte in Ihrer YAML-Datei das ZIP-Archiv im $(System.ArtifactsDirectory) Ordner ihres Agents erzeugen.

Bereitstellen eines Containers

Tipp

Wir empfehlen die Verwendung der Azure Functions-Unterstützung in Azure-Container-Apps zum Hosten Ihrer Funktions-App in einem benutzerdefinierten Linux-Container. Weitere Informationen finden Sie unter Azure Functions on Azure Container Apps overview.

Bei der Bereitstellung einer containerisierten Funktions-App hängt die verwendete Bereitstellungsaufgabe von der spezifischen Hostingumgebung ab.

Sie können die Aufgabe " Bereitstellen von Azure-Container-Apps" (AzureContainerApps) verwenden, um ein Funktions-App-Image in einer Azure-Container-App-Instanz bereitzustellen, die für Azure Functions optimiert ist.

Dieser Code stellt das Basisimage für eine .NET 8 isolierte Prozessmodell-Funktions-App bereit:

trigger:
- main

pool:
  vmImage: 'ubuntu-latest'

steps:
- task: AzureContainerApps@1
  inputs:
    azureSubscription: <Name of your Azure subscription>
    imageToDeploy: 'mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0'
    containerAppName: <Name of your container app>
    resourceGroup: <Name of the resource group>

Im Idealfall würden Sie ihren eigenen benutzerdefinierten Container in der Pipeline erstellen, anstatt ein Basisimage zu verwenden, wie in diesem Beispiel gezeigt. Weitere Informationen finden Sie unter Deploy to Azure Container Apps from Azure Pipelines.

Bereitstellen in einem Slot

Von Bedeutung

Der Flex-Verbrauchsplan unterstützt derzeit keine Slots. Linux-Apps unterstützen auch keine Slots, wenn sie in einem Verbrauchsplan laufen, und die Unterstützung für diese Apps wird zukünftig eingestellt.

trigger:
- main

variables:
  # Azure service connection established during pipeline creation
  azureSubscription: <Name of your Azure subscription>
  appName: <Name of the function app>
  # Agent VM image name
  vmImageName: 'windows-latest'

- task: AzureFunctionApp@2 # Add this at the end of your file
  inputs:
    azureSubscription: <Name of your Azure subscription>
    appType: functionApp # this specifies a Windows-based function app
    appName: $(appName)
    package: $(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip
    deploymentMethod: 'auto' # 'auto' | 'zipDeploy' | 'runFromPackage'. Required. Deployment method. Default: auto.
    deployToSlotOrASE: true
    resourceGroupName: '<RESOURCE_GROUP>'
    slotName: '<SLOT_NAME>'

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

Der folgende YAML-Codeausschnitt zeigt, wie in einem Stagingslot bereitgestellt und dann zu einem Produktionsslot getauscht wird:

- task: AzureFunctionApp@1
  inputs:
    azureSubscription: <Azure service connection>
    appType: functionAppLinux
    appName: <Name of the function app>
    package: $(System.ArtifactsDirectory)/**/*.zip
    deployToSlotOrASE: true
    resourceGroupName: <Name of the resource group>
    slotName: staging

- task: AzureAppServiceManage@0
  inputs:
    azureSubscription: <Azure service connection>
    WebAppName: <name of the function app>
    ResourceGroupName: <name of resource group>
    SourceSlot: staging
    SwapWithProduction: true

Wenn Sie Bereitstellungsplätze verwenden, können Sie auch die folgende Aufgabe hinzufügen, um einen Slot-Swap als Teil Ihrer Bereitstellung auszuführen.

- task: AzureAppServiceManage@0
  inputs:
    azureSubscription: <AZURE_SERVICE_CONNECTION>
    WebAppName: <APP_NAME>
    ResourceGroupName: <RESOURCE_GROUP>
    SourceSlot: <SLOT_NAME>
    SwapWithProduction: true

Erstellen einer Pipeline mit Azure CLI

Verwenden Sie den az functionapp devops-pipeline create, um in Azure eine Buildpipeline zu erstellen. Die Buildpipeline wird erstellt, um alle Codeänderungen zu erstellen und freizugeben, die in Ihrem Repository vorgenommen werden. Der Befehl generiert eine neue YAML-Datei, die die Build- und Releasepipeline definiert und dann an Ihr Repository committet. Die Voraussetzungen für diesen Befehl hängen vom Speicherort des Codes ab.

  • Code in GitHub:

    • Sie müssen die Berechtigung Schreiben für Ihr Abonnement besitzen.

    • Sie müssen der Projektadministrator in Azure DevOps sein.

    • Sie müssen die Berechtigung zum Erstellen eines persönlichen GitHub-Zugriffstokens (PAT) mit ausreichenden Berechtigungen besitzen. Weitere Informationen finden Sie unter GitHub-PAT-Berechtigungsanforderungen.

    • Sie müssen die Berechtigung zum Committen des Hauptbranches in Ihrem GitHub-Repository besitzen, um die automatisch generierte YAML-Datei zu committen.

  • Code in Azure Repos:

    • Sie müssen die Berechtigung Schreiben für Ihr Abonnement besitzen.

    • Sie müssen der Projektadministrator in Azure DevOps sein.

Nächste Schritte