Övning – Distribuera en Azure Functions-app till Azure

Slutförd

Projektet kom med en pipeline som skapar projekten i lösningen och distribuerar webbappen till Azure App Service. Nu är det dags att utöka pipelinen för att även distribuera det nya Azure Functions-projektet.

I den här delen ska du:

  • Granska byggfasen.
  • Lägg till en uppgift för att distribuera funktionsappen.
  • Lägg till en uppgift som konfigurerar den publicerade App Service för att använda den publicerade funktionen.
  • Spara pipelinen för att utlösa ett CI/CD-arbetsflöde.

Granska byggfasen

Här granskar du den befintliga CI/CD-pipelinen som definierats i azure-pipelines.yml.

  1. Från Azure DevOps går du till Pipelines.

  2. Välj pipelinen.

  3. Välj Redigera. Kontrollera att grenen är inställd på main genom att välja den från den nedrullningsbara menyn. Då visas den azure-pipelines.yml fil som definierar den befintliga CI/CD-pipelinen.

    På grund av användningen av jokertecken till projektsökvägarna återställer, skapar och publicerar de markerade aktiviteterna nedan automatiskt det nya Azure Functions-projektet.

    stages:
    - stage: 'Build'
      displayName: 'Build the web application'
      jobs: 
      - job: 'Build'
        displayName: 'Build job'
        pool:
          vmImage: 'ubuntu-20.04'
          demands:
          - npm
    
        variables:
          wwwrootDir: 'Tailspin.SpaceGame.Web/wwwroot'
          dotnetSdkVersion: '6.0.x'
    
        steps:
        - task: UseDotNet@2
          displayName: 'Use .NET SDK $(dotnetSdkVersion)'
          inputs:
            version: '$(dotnetSdkVersion)'
    
        - task: Npm@1
          displayName: 'Run npm install'
          inputs:
            verbose: false
    
        - script: './node_modules/.bin/node-sass $(wwwrootDir) --output $(wwwrootDir)'
          displayName: 'Compile Sass assets'
    
        - task: gulp@1
          displayName: 'Run gulp tasks'
    
        - script: 'echo "$(Build.DefinitionName), $(Build.BuildId), $(Build.BuildNumber)" > buildinfo.txt'
          displayName: 'Write build info'
          workingDirectory: $(wwwrootDir)
    
        - task: DotNetCoreCLI@2
          displayName: 'Restore project dependencies'
          inputs:
            command: 'restore'
            projects: '**/*.csproj'
    
        - task: DotNetCoreCLI@2
          displayName: 'Build the project - $(buildConfiguration)'
          inputs:
            command: 'build'
            arguments: '--no-restore --configuration $(buildConfiguration)'
            projects: '**/*.csproj'
    
        - task: DotNetCoreCLI@2
          displayName: 'Publish the project - $(buildConfiguration)'
          inputs:
            command: 'publish'
            projects: '**/*.csproj'
            publishWebProjects: false
            arguments: '--no-build --configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)/$(buildConfiguration)'
            zipAfterPublish: true
    
        - publish: '$(Build.ArtifactStagingDirectory)'
          artifact: drop
    

Andy: Det här var vår tidigare byggfas. Jag har inte ändrat det från det ursprungliga projektet eftersom uppgifterna redan har konfigurerats för att köras mot alla projekt baserat på jokerteckenmatchningsmönstret.

Mara: Ja, detta bör fungera som det är. Jag tror inte att vi behöver göra några ändringar här. När den här bygguppgiften har körts publiceras zip-filartefakterna för både webb- och topplisteprojekten för distributionsfasen.

Lägga till en uppgift för att distribuera Azure-funktionen

Andy: Jag tror att vi även kan återanvända App Service-distributionsuppgiften i sin helhet. Förhoppningsvis finns det något liknande som vi kan använda för att distribuera en funktionsapp.

Mara: Jag har goda nyheter. Efter lite efterforskningar ser det ut som om det finns en uppgift som konceptuellt liknar App Service-distributionsuppgiften, men för Azure Functions-distributioner. Nu ska vi gå igenom det.

Azure Function App-uppgift

Uppgiften AzureFunctionApp@1 är utformad för att distribuera funktionsappar. Den liknar uppgiften konceptuellt AzureWebApp@1 och innehåller allt som behövs för det här funktionsappsscenariot:

  • azureSubscription refererar till namnet på pipelinevariabeln för Din Azure-tjänstanslutning.
  • appType anger om appen distribueras för Linux (functionAppLinux) eller Windows (functionApp).
  • appName anger namnet på Azure Functions-appinstansen i ditt Azure-konto.
  • package anger sökvägen till paketet som ska distribueras.
  • runtimeStack anger vilken avbildning funktionen ska köras på, vilket krävs för Linux-distributioner.
  • startUpCommand anger startkommandot som ska köras när funktionen har distribuerats, vilket krävs för Linux-distributioner.

Du kan lära dig mer om flexibiliteten för den här uppgiften i dokumentationen för Azure Function App-uppgiften.

Lägg till följande markerade kod i slutet av pipelinen.

- stage: 'Deploy'
  displayName: 'Deploy the web application'
  dependsOn: Build
  jobs:
  - deployment: Deploy
    pool:
      vmImage: 'ubuntu-20.04'
    environment: spike
    variables:
    - group: Release
    strategy:
      runOnce:
        deploy:
          steps:
          - download: current
            artifact: drop
          - task: AzureWebApp@1
            displayName: 'Azure App Service Deploy: website'
            inputs:
              azureSubscription: 'Resource Manager - Tailspin - Space Game'
              appName: '$(WebAppName)'
              appType: webAppLinux
              package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/Tailspin.SpaceGame.Web.zip'

          - task: AzureFunctionApp@1
            displayName: 'Azure Function Deploy: leaderboard'
            inputs:
              azureSubscription: 'Resource Manager - Tailspin - Space Game'
              appType: functionAppLinux
              appName: '$(LeaderboardAppName)'
              package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/Tailspin.SpaceGame.LeaderboardFunction.zip'
              runtimeStack: DOCKER|microsoft/azure-functions-dotnet:4
              startUpCommand: 'func azure functionapp publish $(functionAppName) --no-bundler'

Dricks

I en YAML-fil är blanksteg viktigt. Kontrollera att den aktivitet som du lägger till här använder samma indrag som föregående uppgift.

Lägga till en uppgift för att uppdatera App Service-appinställningarna

Andy: Nu behöver vi bara konfigurera webbappen så att den använder det publicerade rankningsliste-API:et. Vi konfigurerar vanligtvis variabler i portalen, men det vore bättre om vi kunde göra det här. Den förväntar sig en AppSettings-parameter med namnet LeaderboardFunctionUrl.

Mara: Jag håller med. Genom att lägga till en uppgift för det i vår pipeline kan vi undvika oavsiktliga tillsyner på vägen om vi ändrar någon av tjänsterna. Vi kan rätta till det i slutet.

Lägg till följande markerade kod i slutet av pipelinen. Se till att matcha indraget för uppgiften ovanför den. Om du vill veta mer om den här uppgiften kan du läsa dokumenten för azure App Service Settings-uppgiften.

- task: AzureFunctionApp@1
  displayName: 'Azure Function Deploy: leaderboard'
  inputs:
    azureSubscription: 'Resource Manager - Tailspin - Space Game'
    appType: functionAppLinux
    appName: '$(LeaderboardAppName)'
    package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/Tailspin.SpaceGame.LeaderboardFunction.zip'
    runtimeStack: DOCKER|microsoft/azure-functions-dotnet:4
    startUpCommand: 'func azure functionapp publish $(functionAppName) --no-bundler'

- task: AzureAppServiceSettings@1
  displayName: 'Update web app settings'
  inputs:
    azureSubscription: 'Resource Manager - Tailspin - Space Game'
    appName: $(WebAppName)
    resourceGroupName: $(ResourceGroupName)
    appSettings: |
      [
        {
          "name": "AppSettings__LeaderboardFunctionUrl",
          "value": "http://$(LeaderboardAppName).azurewebsites.net/api/LeaderboardFunction",
          "slotSetting": false
        }
      ]

Spara pipelinen för att utlösa en version och version

  1. Välj Spara i det övre högra hörnet på sidan. Bekräfta spara för att utlösa en körning.

  2. I Azure Pipelines går du till versionen. Spåra bygget när det körs.

  3. När bygget har slutförts väljer du webbplatsens distributionsaktivitet och väljer URL:en för att visa den distribuerade webbplatsen.

    En skärmbild av Azure Pipelines som visar platsen för webbplatsens URL.

  4. Du får en sida med webbplatsen som körs på App Service. Rulla nedåt för att bekräfta att rankningslistan har verkliga data i sig. Detta drivs av funktionsappen.

    En skärmbild av webbplatsen space game.

    Kommentar

    Om det uppstår ett fel när rankningslistan läses in dubbelkollar du stegen du följde i den här modulen. Om du ser undantagsmeddelandet "Ett försök gjordes att komma åt en socket på ett sätt som är förbjudet av dess åtkomstbehörigheter" kontrollerar du att apptjänstens AppSettings__LeaderboardFunctionUrl-inställning har angetts korrekt.

  5. Du kan också testa funktionsappen direkt. Navigera bara till url:en med följande format. Svaret är JSON, som bara ska återges som text i webbläsaren.

    http://<leaderboard function name>.azurewebsites.net/api/LeaderboardFunction?pageSize=10
    

    såsom

    http://tailspin-space-game-leaderboard-4692.azurewebsites.net/api/LeaderboardFunction?pageSize=10
    

Andy: Detta visade sig bra! Alla borde vara ganska imponerade av den potential vi har visat här.