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

Ukończone

Projekt został dołączony do potoku, który kompiluje projekty w rozwiązaniu i wdraża aplikację internetową w usłudze aplikacja systemu Azure 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 elementy:

  • Przejrzyj etap kompilacji.
  • Dodaj zadanie do wdrożenia aplikacji funkcji.
  • Dodaj zadanie konfiguruje opublikowaną usługę App Service tak, aby korzystała z opublikowanej funkcji.
  • Zapisz potok, aby wyzwolić przepływ pracy ciągłej integracji/ciągłego wdrażania.

Przeglądanie etapu kompilacji

W tym miejscu zapoznasz się z istniejącym potokiem ciągłej integracji/ciągłego wdrażania zdefiniowanym w pliku 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.

    Ze względu na użycie symboli wieloznacznych do ścieżek projektu wyróżnione zadania zostaną automatycznie przywrócone, skompilowane i opublikowane w nowym projekcie usługi 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 internetowych, jak i wiodących zostaną opublikowane dla etapu Wdrażanie do użycia.

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órych można wdrożyć aplikację funkcji.

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. Przyjrzyjmy się teraz.

Zadanie aplikacji funkcji platformy Azure

Zadanie AzureFunctionApp@1 jest przeznaczone do wdrażania aplikacji funkcji. Jest on koncepcyjnie podobny do zadania i zawiera wszystkie elementy potrzebne w tym scenariuszu AzureWebApp@1 aplikacji funkcji:

  • azureSubscription odwołuje się do nazwy zmiennej potoku połączenia usługi platformy Azure.
  • appType wskazuje, czy aplikacja jest wdrażana dla systemu Linux (functionAppLinux) lub Windows (functionApp).
  • appName określa nazwę wystąpienia aplikacji usługi Azure Functions na koncie platformy Azure.
  • package określa ścieżkę do pakietu, który ma zostać wdrożony.
  • runtimeStack wskazuje, na którym obrazie należy uruchomić funkcję, która jest wymagana dla wdrożeń systemu Linux.
  • startUpCommand Określa polecenie uruchamiania do uruchomienia po wdrożeniu funkcji, która jest wymagana dla wdrożeń systemu Linux.

Więcej informacji na temat elastyczności tego zadania można uzyskać w dokumentacji zadania aplikacji funkcji platformy Azure.

Dodaj następujący wyróżniony kod na końcu potoku.

- 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 dodane tutaj zadanie 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 App Ustawienia o nazwie LeaderboardFunctionUrl.

Mara: Zgadzam się. Dodanie zadania do naszego potoku pomoże nam uniknąć przypadkowego nadzoru w dół drogi, jeśli zmienimy jedną z usług. Możemy to umieścić na końcu.

Dodaj następujący wyróżniony kod na końcu potoku. Pamiętaj, aby dopasować wcięcie zadania powyżej. Jeśli chcesz dowiedzieć się więcej o tym zadaniu, możesz przejrzeć dokumenty dotyczące zadania Ustawienia usługi aplikacja systemu Azure Service.

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

Zapisywanie potoku w celu wyzwolenia kompilacji i wydania

  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. Śledzenie kompilacji 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.

  4. Zostanie wyświetlona strona z witryną działającą w usłudze App Service. Przewiń w dół, aby potwierdzić, że ranking zawiera rzeczywiste dane. Jest to obsługiwane przez aplikację funkcji.

    A screenshot of the Space Game web site.

    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 App Ustawienia__LeaderboardFunctionUrl usługi App service jest ustawione poprawnie.

  5. Możesz również przetestować aplikację funkcji bezpośrednio. 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
    

    takich jak

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

    A screenshot of a web browser showing the JSON response from the leaderboard API Azure Functions app.

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