Övning – Distribuera en Azure Functions-app till Azure
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.
Från Azure DevOps går du till Pipelines.
Välj pipelinen.
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
Välj Spara i det övre högra hörnet på sidan. Bekräfta spara för att utlösa en körning.
I Azure Pipelines går du till versionen. Spåra bygget när det körs.
När bygget har slutförts väljer du webbplatsens distributionsaktivitet och väljer URL:en för att visa den distribuerade webbplatsen.
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.
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.
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.