Упражнение. Развертывание приложения Функции Azure в Azure
Ваш проект изначально включает конвейер для сборки проектов в решении и для развертывания веб-приложения в Службе приложений Azure. Теперь пришло время расширить этот конвейер, чтобы также развернуть новый проект Функции Azure.
В этой части вы получите следующее:
- Просмотрите этап сборки.
- Добавьте задачу для развертывания приложения-функции.
- Добавьте задачу, чтобы настроить опубликованную Служба приложений для использования опубликованной функции.
- Сохраните конвейер, чтобы активировать рабочий процесс CI/CD.
Просмотр этапа сборки
Здесь вы просмотрите существующий конвейер CI/CD, определенный в azure-pipelines.yml.
В Azure DevOps перейдите к Конвейерам.
Выберите конвейер.
Выберите Изменить. Убедитесь, что ветвь имеет значение main , выбрав ее в раскрывающемся меню. Откроется файл azure-pipelines.yml , определяющий существующий конвейер CI/CD.
Из-за использования подстановочных знаков в пути проекта выделенные ниже задачи автоматически восстанавливают, создают и публикуют новый проект Функции Azure.
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
Энди: Это был наш предыдущий этап сборки. Я не изменил его из исходного проекта, так как задачи уже были настроены для выполнения для всех проектов на основе шаблона сопоставления подстановочных знаков.
Мара: Да, это должно работать как есть. Я не думаю, что нам нужно внести какие-либо изменения здесь. После выполнения этой задачи сборки артефакты ZIP-файла для проектов веб-и лидеров будут опубликованы для используемого этапа развертывания.
Добавление задачи для развертывания функции Azure
Энди: Я думаю, что мы также можем повторно использовать задачу развертывания Служба приложений как есть. Надеюсь, есть что-то подобное, что мы можем использовать для развертывания приложения-функции.
Мара: У меня есть хорошие новости. После небольшого исследования это выглядит так, как есть задача, которая концептуально похожа на задачу развертывания Служба приложений, но для Функции Azure развертываний. Давайте с ней познакомимся.
Задача приложения-функции Azure
Задача AzureFunctionApp@1
предназначена для развертывания приложений-функций. Он концептуально похож на AzureWebApp@1
задачу и включает все, что необходимо для этого сценария приложения-функции:
azureSubscription
ссылается на имя переменной конвейера подключения службы Azure.appType
указывает, развертывается ли приложение для Linux (functionAppLinux
) или Windows (functionApp
).appName
указывает имя экземпляра приложения Функции Azure в учетной записи Azure.package
указывает путь к развернутом пакету.runtimeStack
указывает, в каком образе должна выполняться функция, которая требуется для развертываний Linux.startUpCommand
указывает команду запуска для запуска после развертывания функции, которая требуется для развертываний Linux.
Дополнительные сведения о гибкости этой задачи см. в документации по задаче приложения-функции Azure.
Добавьте следующий выделенный код в конец конвейера.
- 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'
Совет
В файле YAML важно пробелы. Убедитесь, что добавленная здесь задача использует то же отступ, что и предыдущая задача.
Добавление задачи для обновления параметров приложения Служба приложений
Энди: Теперь все, что нам нужно сделать, — настроить веб-приложение для использования опубликованного API списка лидеров. Обычно мы настраиваем переменные на портале, но было бы лучше, если бы мы могли это сделать здесь. Он ожидает параметр AppSettings с именем LeaderboardFunctionUrl
.
Мара: Я согласен. Добавление задачи для этого в наш конвейер поможет нам избежать случайного надзора по дороге, если мы изменим любую службу. Мы можем положить его прямо в конце.
Добавьте следующий выделенный код в конец конвейера. Следите за соблюдением отступов в соответствии с предшествующей задачей. Если вы хотите узнать больше об этой задаче, ознакомьтесь с документацией по приложение Azure задаче "Параметры службы".
- 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
}
]
Сохранение конвейера для активации сборки и выпуска
Выберите "Сохранить " в правом верхнем углу страницы. Подтвердите сохранение , чтобы активировать запуск.
В Azure Pipelines перейдите к сборке. Трассировка сборки при выполнении.
После успешной сборки выберите задачу развертывания веб-сайта и выберите URL-адрес для просмотра развернутого сайта.
Вы получите страницу с сайтом, работающим на Служба приложений. Прокрутите вниз, чтобы убедиться, что в таблице лидеров есть реальные данные. Это осуществляется приложением-функцией.
Примечание.
Если возникла ошибка при загрузке таблицы лидеров, дважды проверьте шаги, которые вы выполнили в этом модуле. Если отображается сообщение об исключении "An attempt was made to access a socket in a way forbidden by its access permissions" (Была предпринята попытка доступа к сокету с использованием способа, запрещенного в его разрешениях на доступ), убедитесь, что параметр AppSettings__LeaderboardFunctionUrl в службе приложений задан правильно.
Вы также можете протестировать приложение-функцию напрямую. Просто перейдите по URL-адресу, используя следующий формат. Ответ — JSON, который должен отображаться как текст в браузере.
http://<leaderboard function name>.azurewebsites.net/api/LeaderboardFunction?pageSize=10
как
http://tailspin-space-game-leaderboard-4692.azurewebsites.net/api/LeaderboardFunction?pageSize=10
Энди: Это оказалось здорово! Все должны быть довольно впечатлены потенциалом, который мы показали здесь.