Kontinuerlig leverans med Azure Pipelines

Använd Azure Pipelines för att distribuera automatiskt till Azure Functions. Med Azure Pipelines kan du skapa, testa och distribuera med kontinuerlig integrering (CI) och kontinuerlig leverans (CD) med Hjälp av Azure DevOps.

YAML-pipelines definieras med hjälp av en YAML-fil på lagringsplatsen. Ett steg är det minsta byggblocket i en pipeline och kan vara ett skript eller en uppgift (förpaketerat skript). Lär dig mer om viktiga begrepp och komponenter som utgör en pipeline.

Du använder AzureFunctionApp-uppgiften för att distribuera till Azure Functions. Det finns nu två versioner av AzureFunctionApp-aktiviteten (AzureFunctionApp@1, AzureFunctionApp@2). AzureFunctionApp@2 innehåller förbättrat valideringsstöd som gör pipelines mindre benägna att misslyckas på grund av fel.

Välj din uppgiftsversion överst i artikeln. YAML-pipelines är inte tillgängliga för Azure DevOps 2019 och tidigare.

Förutsättningar

Skapa appen

  1. Logga in på din Azure DevOps-organisation och gå till projektet.
  2. I projektet navigerar du till sidan Pipelines . Välj sedan Ny pipeline.
  3. Välj något av följande alternativ för Var är din kod?:
    • GitHub: Du kan omdirigeras till GitHub för att logga in. I så fall anger du dina GitHub-autentiseringsuppgifter. När det här är den första anslutningen till GitHub vägleder guiden dig också genom processen att ansluta DevOps till dina GitHub-konton.
    • Azure Repos Git: Du kan omedelbart välja en lagringsplats i ditt aktuella DevOps-projekt.
  4. När listan över lagringsplatser visas väljer du exempelapplagringsplatsen.
  5. Azure Pipelines analyserar lagringsplatsen och i Konfigurera din pipeline finns en lista över potentiella mallar. Välj lämplig funktionsappmall för ditt språk. Om du inte ser rätt mall väljer du Visa mer.
  6. Välj Spara och kör, välj sedan Checka in direkt till huvudgrenen och välj sedan Spara och kör igen.
  7. En ny körning startas. Vänta tills körningen har slutförts.

Exempel på YAML-byggpipelines

Följande språkspecifika pipelines kan användas för att skapa appar.

Du kan använda följande exempel för att skapa en YAML-fil för att skapa en .NET-app.

Om du ser fel när du skapar din app kontrollerar du att den version av .NET som du använder matchar din Azure Functions-version. Mer information finns i Översikt över Azure Functions-körningsversioner.

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'

Distribuera din app

Du distribuerar med azure function app deploy-uppgiften . Den här uppgiften kräver en Azure-tjänstanslutning som indata. En Azure-tjänstanslutning lagrar autentiseringsuppgifterna för att ansluta från Azure Pipelines till Azure.

Om du vill distribuera till Azure Functions lägger du till följande kodfragment i slutet av azure-pipelines.yml filen. Standardvärdet appType är Windows. Du kan ange Linux genom att ange appType till functionAppLinux.

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

Kodfragmentet förutsätter att byggstegen i YAML-filen skapar zip-arkivet $(System.ArtifactsDirectory) i mappen på din agent.

Distribuera en container

Du kan automatiskt distribuera koden till Azure Functions som en anpassad container efter varje lyckad version. Mer information om containrar finns i Skapa en funktion i Linux med hjälp av en anpassad container.

Distribuera med azure-funktionsappen för containeraktiviteten

Det enklaste sättet att distribuera till en container är att använda azure-funktionsappen i containerdistributionsuppgiften.

Om du vill distribuera lägger du till följande kodfragment i slutet av YAML-filen:

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)

Kodfragmentet skickar Docker-avbildningen till Azure Container Registry. Azure Function App on Container Deploy-uppgiften hämtar lämplig Docker-avbildning som motsvarar BuildId från den angivna lagringsplatsen och distribuerar sedan avbildningen.

Distribuera till ett fack

Du kan konfigurera funktionsappen så att den har flera platser. Med fack kan du distribuera din app på ett säkert sätt och testa den innan du gör den tillgänglig för dina kunder.

Följande YAML-kodfragment visar hur du distribuerar till ett mellanlagringsfack och sedan byter till en produktionsplats:

- 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

Skapa en pipeline med Azure CLI

Använd kommandot för az functionapp devops-pipeline createatt skapa en byggpipeline i Azure. Bygg-pipelinen skapas för att skapa och släppa eventuella kodändringar som görs på lagringsplatsen. Kommandot genererar en ny YAML-fil som definierar bygg- och versionspipelinen och sedan checkar in den på lagringsplatsen. Förutsättningarna för det här kommandot beror på kodens plats.

  • Om koden finns i GitHub:

    • Du måste ha skrivbehörighet för din prenumeration.

    • Du måste vara projektadministratör i Azure DevOps.

    • Du måste ha behörighet att skapa en personlig Åtkomsttoken för GitHub (PAT) som har tillräcklig behörighet. Mer information finns i Behörighetskrav för GitHub PAT.

    • Du måste ha behörighet att checka in till huvudgrenen på din GitHub-lagringsplats så att du kan checka in den automatiskt genererade YAML-filen.

  • Om koden finns i Azure Repos:

    • Du måste ha skrivbehörighet för din prenumeration.

    • Du måste vara projektadministratör i Azure DevOps.

Skapa appen

  1. Logga in på din Azure DevOps-organisation och gå till projektet.
  2. I projektet navigerar du till sidan Pipelines . Välj sedan åtgärden för att skapa en ny pipeline.
  3. Gå igenom stegen i guiden genom att först välja GitHub som plats för källkoden.
  4. Du kan omdirigeras till GitHub för att logga in. I så fall anger du dina GitHub-autentiseringsuppgifter.
  5. När listan över lagringsplatser visas väljer du exempelapplagringsplatsen.
  6. Azure Pipelines analyserar lagringsplatsen och rekommenderar en mall. Välj Spara och kör, välj sedan Checka in direkt till huvudgrenen och välj sedan Spara och kör igen.
  7. En ny körning startas. Vänta tills körningen har slutförts.

Exempel på YAML-byggpipelines

Följande språkspecifika pipelines kan användas för att skapa appar.

Du kan använda följande exempel för att skapa en YAML-fil för att skapa en .NET-app:

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'

Distribuera din app

Du distribuerar med Azure Function App Deploy v2-uppgiften . Den här uppgiften kräver en Azure-tjänstanslutning som indata. En Azure-tjänstanslutning lagrar autentiseringsuppgifterna för att ansluta från Azure Pipelines till Azure.

V2-versionen av uppgiften innehåller stöd för nyare programstackar för .NET, Python och Node. Uppgiften innehåller nätverksfördistributionskontroller. När det finns problem med fördistributionen stoppas distributionen.

Om du vill distribuera till Azure Functions lägger du till följande kodfragment i slutet av azure-pipelines.yml filen. Standardvärdet appType är Windows. Du kan ange Linux genom att ange appType till functionAppLinux.

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

Kodfragmentet förutsätter att byggstegen i YAML-filen skapar zip-arkivet $(System.ArtifactsDirectory) i mappen på din agent.

Distribuera en container

Du kan automatiskt distribuera koden till Azure Functions som en anpassad container efter varje lyckad version. Mer information om containrar finns i Arbeta med containrar och Azure Functions .

Distribuera med azure-funktionsappen för containeraktiviteten

Det enklaste sättet att distribuera till en container är att använda azure-funktionsappen i containerdistributionsuppgiften.

Om du vill distribuera lägger du till följande kodfragment i slutet av YAML-filen:

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)

Kodfragmentet skickar Docker-avbildningen till Azure Container Registry. Azure Function App on Container Deploy-uppgiften hämtar lämplig Docker-avbildning som motsvarar BuildId från den angivna lagringsplatsen och distribuerar sedan avbildningen.

Distribuera till ett fack

Du kan konfigurera funktionsappen så att den har flera platser. Med fack kan du distribuera din app på ett säkert sätt och testa den innan du gör den tillgänglig för dina kunder.

Följande YAML-kodfragment visar hur du distribuerar till ett mellanlagringsfack och sedan byter till en produktionsplats:

- task: AzureFunctionApp@2
  inputs:
    azureSubscription: <Azure service connection>
    appType: functionAppLinux
    appName: <Name of the Function app>
    package: $(System.ArtifactsDirectory)/**/*.zip
    deploymentMethod: 'auto'
    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

Skapa en pipeline med Azure CLI

Använd kommandot för az functionapp devops-pipeline createatt skapa en byggpipeline i Azure. Bygg-pipelinen skapas för att skapa och släppa eventuella kodändringar som görs på lagringsplatsen. Kommandot genererar en ny YAML-fil som definierar bygg- och versionspipelinen och sedan checkar in den på lagringsplatsen. Förutsättningarna för det här kommandot beror på kodens plats.

  • Om koden finns i GitHub:

    • Du måste ha skrivbehörighet för din prenumeration.

    • Du måste vara projektadministratör i Azure DevOps.

    • Du måste ha behörighet att skapa en personlig Åtkomsttoken för GitHub (PAT) som har tillräcklig behörighet. Mer information finns i Behörighetskrav för GitHub PAT.

    • Du måste ha behörighet att checka in till huvudgrenen på din GitHub-lagringsplats så att du kan checka in den automatiskt genererade YAML-filen.

  • Om koden finns i Azure Repos:

    • Du måste ha skrivbehörighet för din prenumeration.

    • Du måste vara projektadministratör i Azure DevOps.

Nästa steg

  • Läs översikten över Azure Functions.
  • Granska översikten över Azure DevOps.