Cvičení – nasazení aplikace Azure Functions do Azure
Váš projekt obsahuje potrubí, které sestaví projekty v řešení a nasadí webovou aplikaci do služby Azure App Service. Teď je čas rozšířit tuto pipeline tak, aby nasadila také nový projekt Azure Functions.
V této části provedete tyto úlohy:
- Zkontrolujte fázi sestavení.
- Přidejte úlohu pro nasazení aplikace funkcí.
- Přidejte úlohu, která nakonfiguruje publikovanou službu App Service tak, aby používala publikovanou funkci.
- Uložte pipeline, aby spustila CI/CD workflow.
Revize fáze sestavení
Tady zkontrolujte existující kanál CI/CD definovaný v azure-pipelines.yml.
V Azure DevOps přejděte na Kanály.
Vyberte kanál.
Vyberte položku Upravit. Ujistěte se, že je větev nastavená na hlavní , a to tak, že ji vyberete z rozevírací nabídky. Tím se zobrazí soubor azure-pipelines.yml , který definuje existující kanál CI/CD.
Z důvodu použití zástupných znaků k cestám projektu se zvýrazněné úkoly v tomto souboru automaticky obnoví, sestaví a publikují nový 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: Tohle byla naše předchozí fáze sestavení. Nezměnil(a) jsem ho z původního projektu, protože úkoly byly už nakonfigurované tak, aby běžely proti všem projektům na základě vzoru porovnávání se zástupnými znamény.
Mara: Ano, tohle by mělo fungovat tak, jak je. Myslím, že tady nemusíme dělat žádné změny. Po spuštění této úlohy sestavení budou archivy ZIP pro oba projekty - webový a tabulku výsledků - publikovány, aby mohly být použity ve fázi nasazení.
Přidání úlohy pro nasazení funkce Azure Functions
Andy: Myslím, že můžeme také znovu použít úlohu nasazení služby App Service, jak je. Doufáme, že existuje něco podobného, co můžeme použít k nasazení aplikace funkcí.
Mara: Mám dobrou zprávu. Po malém průzkumu to vypadá, že existuje úloha, která je koncepčně podobná nasazovací úloze služby App Service, ale týkající se nasazování Azure Functions. Pojďme se na to podívat.
Úloha funkční aplikace Azure
Úloha AzureFunctionApp@1 je určená k nasazení funkčních aplikací. To je koncepčně podobné úkolu AzureWebApp@1 a zahrnuje vše potřebné pro tento scénář aplikace typu function-app:
-
azureSubscriptionodkazuje na název proměnné vaší pipeline připojení služby Azure. -
appTypeoznačuje, jestli se aplikace nasazuje pro Linux (functionAppLinux) nebo Windows (functionApp). -
appNameurčuje název instance aplikace Azure Functions ve vašem účtu Azure. -
packageurčuje cestu k balíčku, který se má nasadit. -
runtimeStackoznačuje, na který obrázek má být funkce spuštěna, což je nutné pro nasazení na Linuxu. -
startUpCommandurčuje spouštěcí příkaz, který se má spustit po nasazení funkce, což je požadováno pro nasazení v Linuxu.
Další informace o flexibilitě této úlohy najdete v dokumentaci k úloze Aplikace funkcí Azure.
Na konec kanálu přidejte následující zvýrazněný kód.
- 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'
Návod
V souboru YAML jsou důležité mezery. Ujistěte se, že zde přidaný úkol používá stejné odsazení jako předchozí úkol.
Přidání úlohy pro aktualizaci nastavení aplikace služby App Service
Andy: Teď stačí nakonfigurovat webovou aplikaci tak, aby používala publikované rozhraní API pro tabulky výsledků. Na portálu obvykle konfigurujeme proměnné, ale bylo by lepší to udělat tady. Očekává parametr AppSettings s názvem LeaderboardFunctionUrl.
Mara: Souhlasím. Přidání úkolu do našeho pracovního postupu nám pomůže vyhnout se náhodným přehlédnutím v budoucnu, pokud změníme jednu ze služeb. Můžeme to dát přímo na konec.
Na konec kanálu přidejte následující zvýrazněný kód. Ujistěte se, že odpovídá odsazení úkolu nad ním. Pokud chcete získat další informace o této úloze, můžete si projít dokumentaci k úloze 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
}
]
Uložte pipeline pro spuštění sestavení a vydání
V pravém horním rohu stránky vyberte Uložit . Potvrďte uložení, aby se aktivovalo spuštění.
V Azure Pipelines přejděte na build. Trasujte sestavení při spuštění.
Po úspěšném sestavení vyberte úlohu nasazení webu a vyberte adresu URL pro zobrazení nasazeného webu.
Snímek obrazovky Azure Pipelines, zobrazující umístění webové adresy URL.
Zobrazí se stránka s webem spuštěným ve službě App Service. Posuňte se dolů, abyste potvrdili, že tabulka výsledků obsahuje skutečná data. Tato funkce je poháněna funkční aplikací.
Snímek obrazovky webové stránky Space Game.
Poznámka:
Pokud při načítání tabulky výsledků dojde k chybě, pečlivě zkontrolujte kroky, které jste provedli v tomto modulu. Pokud se zobrazí zpráva o výjimce "Došlo k pokusu o přístup k soketu způsobem zakázaným jeho přístupovými oprávněními", ujistěte se, že je správně nastavené nastavení služby App Service AppSettings__LeaderboardFunctionUrl.
Funkční aplikaci můžete také otestovat přímo. Stačí přejít na adresu URL pomocí následujícího formátu. Odpověď je JSON, která by se měla v prohlížeči vykreslit jako text.
http://<leaderboard function name>.azurewebsites.net/api/LeaderboardFunction?pageSize=10například
http://tailspin-space-game-leaderboard-4692.azurewebsites.net/api/LeaderboardFunction?pageSize=10
Andy: To se ukázalo skvěle! Každý by měl být docela ohromen potenciálem, který jsme zde ukázali.