Continuous Delivery mit Azure Pipelines

Verwenden Sie Azure Pipelines für automatisches Bereitstellen in Azure Functions. 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.

YAML-Pipelines sind für Azure DevOps 2019 und früher nicht verfügbar.

Voraussetzungen

  • Ein GitHub-Konto, in dem Sie ein Repository erstellen können. Wenn Sie noch keines besitzen, können Sie es kostenlos erstellen.

  • Eine Azure DevOps-Organisation. Wenn Sie noch keines besitzen, können Sie es kostenlos erstellen. Wenn Ihr Team bereits über eine solche Organisation verfügt, stellen Sie sicher, dass Sie Administrator des Azure DevOps-Projekts sind, das Sie verwenden möchten.

  • Möglichkeit zum Ausführen von Pipelines auf von Microsoft gehosteten Agents. Sie können entweder einen Parallelauftrag erwerben oder einen Free-Tarif anfordern.

Erstellen Sie Ihre Funktions-App

Dies ist eine Schritt-für-Schritt-Anleitung zur Verwendung von Azure Pipelines mit Azure Functions.

Wenn Sie bereits über eine App auf GitHub verfügen, die Sie bereitstellen möchten, können Sie versuchen, eine Pipeline für deren Code zu erstellen.

Um stattdessen Beispielcode zu verwenden, forken Sie dieses GitHub-Repository:

    https://github.com/microsoft/devops-project-samples/tree/master/dotnet/aspnetcore/functionApp

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:
- script: |
    dotnet restore
    dotnet build --configuration Release
- task: DotNetCoreCLI@2
  inputs:
    command: publish
    arguments: '--configuration Release --output publish_output'
    projects: '*.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 der Aufgabe Azure-Funktions-App-Bereitstellung. Diese Aufgabe erfordert eine Azure-Dienstverbindung als Eingabe. Eine Azure-Dienstverbindung speichert die Anmeldeinformationen für die Verbindung von Azure Pipelines mit Azure.

Fügen Sie zum Bereitstellen in Azure Functions den folgenden Codeausschnitt am Ende Ihrer azure-pipelines.yml-Datei hinzu. Der Standardwert appType ist „Windows“. Sie können „Linux“ angeben, indem Sie appType auf functionAppLinux festlegen.

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: AzureFunctionApp@1 # Add this at the end of your file
  inputs:
    azureSubscription: <Azure service connection>
    appType: functionAppLinux # default is functionApp
    appName: $(appName)
    package: $(System.ArtifactsDirectory)/**/*.zip
    #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 Name>'
    #slotName: '<Slot name>'

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

Bereitstellen eines Containers

Sie können Ihren Code nach jedem erfolgreichen Build automatisch in Azure Functions als benutzerdefinierten Container bereitstellen. Weitere Informationen zu Containern finden Sie unter Erstellen einer Funktion unter Linux mithilfe eines benutzerdefinierten Containers.

Bereitstellen mit der Aufgabe „Azure-Funktions-App für Container“

Die einfachste Möglichkeit zum Bereitstellen in einem Container ist die Verwendung der Aufgabe Azure-Funktions-App-in-Container-Bereitstellung.

Fügen Sie zum Bereitstellen den folgenden Codeausschnitt am Ende Ihrer YAML-Datei hinzu:

trigger:
- main

variables:
  # Container registry service connection established during pipeline creation
  dockerRegistryServiceConnection: <Docker registry service connection>
  imageRepository: <Name of your image repository>
  containerRegistry: <Name of the Azure container registry>
  dockerfilePath: '$(Build.SourcesDirectory)/Dockerfile'
  tag: '$(Build.BuildId)'
  
  # Agent VM image name
  vmImageName: 'ubuntu-latest'

- task: AzureFunctionAppContainer@1 # Add this at the end of your file
  inputs:
    azureSubscription: '<Azure service connection>'
    appName: '<Name of the function app>'
    imageName: $(containerRegistry)/$(imageRepository):$(tag)

Mit dem Codeausschnitt wird das Docker-Image an Ihre Azure Container Registry gepusht. Die Aufgabe Azure-Funktions-App-in-Container-Bereitstellung pullt das entsprechende Docker-Image, das BuildId entspricht, aus dem angegebenen Repository und stellt das Image dann bereit.

Bereitstellen in einem Slot

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

Erstellen einer Pipeline mit Azure CLI

Verwenden Sie den Befehlaz functionapp devops-pipeline create , um eine Buildpipeline in Azure 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