Ćwiczenie — wdrażanie aplikacji usługi Azure Functions na platformie Azure
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.
W usłudze Azure DevOps przejdź do pozycji Potoki.
Wybierz potok.
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.
-
azureSubscriptionodwołuje się do nazwy zmiennej potoku połączenia usługi Azure. -
appTypewskazuje, czy aplikacja jest wdrażana dla systemu Linux (functionAppLinux) lub Windows (functionApp). -
appNameokreśla nazwę instancji aplikacji usługi Azure Functions na Twoim koncie Azure. -
packageokreśla ścieżkę do pakietu, który ma zostać wdrożony. -
runtimeStackwskazuje, na którym obrazie należy uruchomić funkcję, co jest konieczne dla wdrożeń w systemie Linux. -
startUpCommandokreś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
Wybierz pozycję Zapisz w prawym górnym rogu strony. Potwierdź polecenie Zapisz, aby wyzwolić przebieg.
W usłudze Azure Pipelines przejdź do kompilacji. Śledź kompilację podczas jej uruchamiania.
Po pomyślnym zakończeniu kompilacji wybierz zadanie wdrażania witryny internetowej i wybierz adres URL, aby wyświetlić wdrożona witryna.
Zrzut ekranu usługi Azure Pipelines przedstawiający lokalizację adresu URL witryny internetowej.
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.
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=10jak
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.