Ćwiczenie — wdrażanie aplikacji usługi Azure Functions na platformie Azure

Ukończone

Projekt zawiera potok, który kompiluje projekty w ramach rozwiązania i wdraża aplikację internetową w usłudze Azure App Service. Teraz nadszedł czas, aby rozszerzyć ten potok, aby wdrożyć również nowy projekt usługi Azure Functions.

W tej części wykonasz następujące zadania:

  • Przejrzyj etap kompilacji.
  • Dodaj zadanie do wdrożenia aplikacji funkcjonalnej.
  • Dodaj zadanie, aby skonfigurować opublikowaną usługę App Service do używania opublikowanej funkcji.
  • Zapisz pipeline, aby wyzwolić przepływ pracy CI/CD.

Przeglądanie etapu kompilacji

W tym miejscu przyjrzyj się istniejącemu procesowi CI/CD zdefiniowanemu w azure-pipelines.yml.

  1. W usłudze Azure DevOps przejdź do pozycji Potoki.

  2. Wybierz potok.

  3. Zaznacz Edytuj. Upewnij się, że gałąź jest ustawiona na główną , wybierając ją z menu rozwijanego. Spowoduje to wyświetlenie pliku azure-pipelines.yml definiującego istniejący potok ciągłej integracji/ciągłego wdrażania.

    Z powodu użycia symboli wieloznacznych w ścieżkach projektów wyróżnione zadania w tym pliku automatycznie przywracają, kompilują i publikują nowy projekt Azure Functions.

    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: To był nasz poprzedni etap kompilacji. Nie zmieniono go z oryginalnego projektu, ponieważ zadania zostały już skonfigurowane do uruchamiania względem wszystkich projektów na podstawie wzorca dopasowania symboli wieloznacznych.

Mara: Tak, to powinno działać tak, jak jest. Nie sądzę, abyśmy musieli wprowadzić tutaj jakiekolwiek zmiany. Po uruchomieniu tego zadania kompilacji artefakty plików zip zarówno dla projektów webowych, jak i tablic wyników zostaną opublikowane do wykorzystania na etapie wdrażania.

Dodawanie zadania w celu wdrożenia funkcji platformy Azure

Andy: Myślę, że możemy również ponownie użyć zadania wdrożenia usługi App Service, tak jak jest. Mam nadzieję, że istnieje coś podobnego, za pomocą którego można wdrożyć aplikację funkcjonalną.

Mara: Mam dobre wieści. Po kilku badaniach wygląda na to, że istnieje zadanie, które jest koncepcyjnie podobne do zadania wdrażania usługi App Service, ale w przypadku wdrożeń usługi Azure Functions. Przejrzyjmy to teraz.

Zadanie funkcji aplikacji Azure

Zadanie AzureFunctionApp@1 jest przeznaczone do wdrażania aplikacji funkcyjnych. Koncepcyjnie jest podobny do zadania AzureWebApp@1 i zawiera wszystko, co potrzebne w tym scenariuszu aplikacji funkcji.

  • azureSubscription odwołuje się do nazwy zmiennej potoku połączenia usługi Azure.
  • appType wskazuje, czy aplikacja jest wdrażana dla systemu Linux (functionAppLinux) lub Windows (functionApp).
  • appName określa nazwę instancji aplikacji usługi Azure Functions na Twoim koncie Azure.
  • package określa ścieżkę do pakietu, który ma zostać wdrożony.
  • runtimeStack wskazuje, na którym obrazie należy uruchomić funkcję, co jest konieczne dla wdrożeń w systemie Linux.
  • startUpCommand określa polecenie startowe, które ma zostać uruchomione po wdrożeniu funkcji, co jest wymagane dla wdrożeń systemu Linux.

Więcej informacji na temat elastyczności tego zadania można znaleźć w dokumentacji zadania Azure Function App.

Dodaj następujący wyróżniony kod na końcu swojego pipeline'u.

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

Napiwek

W pliku YAML odstęp jest ważny. Upewnij się, że zadanie, które dodasz tutaj, używa tego samego wcięcia co poprzednie zadanie.

Dodawanie zadania w celu zaktualizowania ustawień aplikacji usługi App Service

Andy: Teraz wystarczy skonfigurować aplikację internetową do korzystania z opublikowanego interfejsu API rankingu. Zwykle konfigurujemy zmienne w portalu, ale byłoby lepiej, gdybyśmy mogli to zrobić tutaj. Oczekuje parametru AppSettings o nazwie LeaderboardFunctionUrl.

Mara: Zgadzam się. Dodanie zadania do naszego procesu pomoże nam uniknąć przypadkowych przeoczeń w przyszłości, jeśli zmienimy którąkolwiek z usług. Możemy to umieścić na końcu.

Dodaj następujący wyróżniony kod na końcu swojego pipeline'u. Pamiętaj, aby dopasować wcięcie zadania powyżej. Jeśli chcesz dowiedzieć się więcej o tym zadaniu, możesz przejrzeć dokumentację dotyczącą zadania Azure App Service Settings.

- 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
        }
      ]

Zapisz potok, aby wyzwolić kompilację i wydanie

  1. Wybierz pozycję Zapisz w prawym górnym rogu strony. Potwierdź polecenie Zapisz, aby wyzwolić przebieg.

  2. W usłudze Azure Pipelines przejdź do kompilacji. Śledź kompilację podczas jej uruchamiania.

  3. Po pomyślnym zakończeniu kompilacji wybierz zadanie wdrażania witryny internetowej i wybierz adres URL, aby wyświetlić wdrożona witryna.

    A screenshot of Azure Pipelines, showing the location of the web site URL.Zrzut ekranu usługi Azure Pipelines przedstawiający lokalizację adresu URL witryny internetowej.

  4. Zostanie wyświetlona strona z witryną uruchomioną w usłudze App Service. Przewiń w dół, aby potwierdzić, że ranking zawiera rzeczywiste dane. Ta funkcja jest obsługiwana przez aplikację funkcyjną.

    Zrzut ekranu witryny internetowej Space Game.

    Uwaga

    Jeśli wystąpił błąd podczas ładowania rankingu, sprawdź dokładnie kroki, które wykonano w tym module. Jeśli zostanie wyświetlony komunikat o wyjątku "Podjęto próbę uzyskania dostępu do gniazda w sposób zabroniony przez jego uprawnienia dostępu", upewnij się, że ustawienie AppSettings__LeaderboardFunctionUrl usługi App Service jest ustawione poprawnie.

  5. Możesz również przetestować aplikację funkcyjną. Wystarczy przejść do adresu URL, używając następującego formatu. Odpowiedź to JSON, który powinien być renderowany tak samo jak tekst w przeglądarce.

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

    jak

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

Andy: To okazało się wspaniałe! Każdy powinien być pod wrażeniem potencjału, który pokazaliśmy tutaj.