Непрерывная поставка с помощью Azure Pipelines
Используйте Azure Pipelines для автоматического развертывания в службе Функции Azure. Azure Pipelines позволяет создавать, тестировать и развертывать ресурсы с использованием технологий непрерывной интеграции (CI) и непрерывной поставки (CD) в Azure DevOps.
Конвейеры YAML определяются с помощью YAML-файла в репозитории. Шаг является наименьшим стандартным блоком конвейера и может быть скриптом или задачей (предварительно упакованым скриптом). Узнайте о ключевых понятиях и компонентах, составляющих конвейер.
Вы будете AzureFunctionApp
использовать задачу для развертывания в Функции Azure. Теперь существует две версии задачи AzureFunctionApp (AzureFunctionApp@1, AzureFunctionApp@2). AzureFunctionApp@2
включает расширенную поддержку проверки, которая снижает вероятность сбоя конвейеров из-за ошибок.
Выберите версию задачи в верхней части статьи. Конвейеры YAML недоступны для Azure DevOps 2019 и более ранних версий.
Примечание.
AzureFunctionApp@2 настоятельно рекомендуется. Развертывание в приложении в плане потребления Flex поддерживается только в версии 2.
Необходимые компоненты
Организация Azure DevOps. Если у вас нет учетной записи, вы можете создать ее бесплатно. Если у вашей команды уже есть организация Azure DevOps, убедитесь, что вы являетесь администратором проекта Azure DevOps, который вы хотите использовать.
Возможность запуска конвейеров на размещенных агентах Майкрософт. Вы можете приобрести параллельное задание или запросить уровень "Бесплатный".
Если вы планируете использовать GitHub вместо Azure Repos, вам также нужен репозиторий GitHub. Если у вас нет учетной записи GitHub, ее можно создать бесплатно.
Существующее приложение-функция в Azure с исходным кодом в поддерживаемом репозитории. Если у вас еще нет проекта кода Функции Azure, можно создать его, выполнив следующую статью по языку:
Не забудьте передать локальный проект кода в репозиторий GitHub или Azure Repos после публикации в приложение-функцию.
Сборка приложения
- Войдите в свою организацию Azure DevOps и откройте нужный проект.
- В этом проекте перейдите к странице Pipelines (Конвейеры). Затем нажмите New pipeline (Создать конвейер).
- Выберите один из следующих вариантов для вашего кода?
- GitHub: вы можете быть перенаправлены на GitHub для входа. Для этого введите учетные данные GitHub. При первом подключении к GitHub мастер также описывает процесс подключения DevOps к учетным записям GitHub.
- Azure Repos Git: вы сразу же сможете выбрать репозиторий в текущем проекте DevOps.
- Когда появится список репозиториев, выберите репозиторий с примером приложения.
- Azure Pipelines анализирует репозиторий и в разделе "Настройка конвейера " содержит список потенциальных шаблонов. Выберите соответствующий шаблон приложения-функции для вашего языка. Если вы не видите правильный шаблон, выберите "Показать больше".
- Щелкните Save and run (Сохранить и запустить), затем выберите Commit directly to the main branch (Зафиксировать непосредственно в главной ветви) и снова щелкните Save and run (Сохранить и запустить).
- Будет выполнен новый запуск. Дождитесь завершения задания.
Примеры конвейеров сборки YAML
Для создания приложений можно использовать следующие конвейеры для соответствующего языка.
В следующем примере можно создать ФАЙЛ YAML для создания приложения .NET.
Если при создании приложения возникают ошибки, убедитесь, что версия .NET, используемая вами, соответствует Функции Azure версии. Дополнительные сведения см. в обзоре версий среды выполнения Функций Azure.
pool:
vmImage: 'windows-latest'
steps:
- script: |
dotnet restore
dotnet build --configuration Release
- task: DotNetCoreCLI@2
inputs:
command: publish
arguments: '--configuration Release --output publish_output'
projects: '*.csproj'
publishWebProjects: false
modifyOutputPath: false
zipAfterPublish: false
- task: ArchiveFiles@2
displayName: "Archive files"
inputs:
rootFolderOrFile: "$(System.DefaultWorkingDirectory)/publish_output"
includeRootFolder: false
archiveFile: "$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip"
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip'
artifactName: 'drop'
Развертывание приложения
Вы развернете задачу развертывания приложения-функции Azure. Для этой задачи в качестве входных данных требуется подключение службы Azure. Подключение службы Azure сохраняет учетные данные для подключения из Azure Pipelines к Azure.
Чтобы развернуть службу Функции Azure, добавьте следующий фрагмент кода в конце файла azure-pipelines.yml
. Установленное по умолчанию значение appType
соответствует системе Windows. Можно указать систему Linux, указав для параметра appType
значение functionAppLinux
. Развертывание в приложении Flex Consumption не поддерживается с @v1 задачей AzureFunctionApp.
trigger:
- main
variables:
# Azure service connection established during pipeline creation
azureSubscription: <Name of your Azure subscription>
appName: <Name of the function app>
# Agent VM image name
vmImageName: 'ubuntu-latest'
- task: AzureFunctionApp@1 # Add this at the end of your file
inputs:
azureSubscription: <Azure service connection>
appType: functionAppLinux # default is functionApp
appName: $(appName)
package: $(System.ArtifactsDirectory)/**/*.zip
#Uncomment the next lines to deploy to a deployment slot
#Note that deployment slots is not supported for Linux Dynamic SKU
#deployToSlotOrASE: true
#resourceGroupName: '<Resource Group Name>'
#slotName: '<Slot name>'
В этом фрагменте предполагается, что шаги сборки в файле YAML создают ZIP-архив в папке $(System.ArtifactsDirectory)
агента.
Развертывание контейнера
Вы можете автоматически развернуть код в качестве контейнерного приложения-функции после каждой успешной сборки. Дополнительные сведения о контейнерах см. в статье "Работа с контейнерами и Функции Azure".
Самый простой способ развертывания в контейнере — использовать приложение-функцию Azure в задаче развертывания контейнера.
Чтобы выполнить развертывание, добавьте следующий фрагмент кода в конце файла YAML:
trigger:
- main
variables:
# Container registry service connection established during pipeline creation
dockerRegistryServiceConnection: <Docker registry service connection>
imageRepository: <Name of your image repository>
containerRegistry: <Name of the Azure container registry>
dockerfilePath: '$(Build.SourcesDirectory)/Dockerfile'
tag: '$(Build.BuildId)'
# Agent VM image name
vmImageName: 'ubuntu-latest'
- task: AzureFunctionAppContainer@1 # Add this at the end of your file
inputs:
azureSubscription: '<Azure service connection>'
appName: '<Name of the function app>'
imageName: $(containerRegistry)/$(imageRepository):$(tag)
Фрагмент отправляет образ Docker в Реестр контейнеров Azure. Задача Приложение-функция Azure в развертывании контейнера извлекает образ Docker, соответствующий BuildId
из указанного репозитория, а затем развертывает образ.
Полный пример конвейера, включая сборку контейнера и публикацию в реестре контейнеров, см . в этом примере развертывания контейнеров Azure Pipelines.
Развертывание в слот
Вы можете настроить несколько слотов в приложении-функции. Слоты позволяют безопасно развернуть приложение и протестировать его, прежде чем сделать его доступным для клиентов.
В следующем фрагменте YAML показано, как выполнить развертывание в промежуточном слоте, а затем переключиться на рабочий слот:
- task: AzureFunctionApp@1
inputs:
azureSubscription: <Azure service connection>
appType: functionAppLinux
appName: <Name of the Function app>
package: $(System.ArtifactsDirectory)/**/*.zip
deployToSlotOrASE: true
resourceGroupName: <Name of the resource group>
slotName: staging
- task: AzureAppServiceManage@0
inputs:
azureSubscription: <Azure service connection>
WebAppName: <name of the Function app>
ResourceGroupName: <name of resource group>
SourceSlot: staging
SwapWithProduction: true
Создание конвейера с использованием Azure CLI
Чтобы создать конвейер сборки в Azure, используйте команду az functionapp devops-pipeline create
. Конвейер сборки создается для сборки и выпуска всех изменений кода, внесенных в репозиторий. Данная команда создает новый YAML-файл, который определяет конвейер сборки и выпуска, а затем фиксирует его в репозитории. Необходимые условия для выполнения этой команды зависят от расположения кода.
Если ваш код находится на портале GitHub:
у вас должны быть разрешения на запись для своей подписки;
вы должны быть администратором проекта в Azure DevOps.
у вас должны быть разрешения на создание личного маркера доступа (PAT) GitHub с достаточными разрешениями. Дополнительные сведения см. в разделе Создание репозиториев GitHub.
Чтобы зафиксировать автоматически созданный YAML-файл, необходимы разрешения на фиксацию в главной ветви в репозитории GitHub.
Если ваш код находится в Azure Repos:
у вас должны быть разрешения на запись для своей подписки;
вы должны быть администратором проекта в Azure DevOps.
Сборка приложения
- Войдите в свою организацию Azure DevOps и откройте нужный проект.
- В этом проекте перейдите к странице Pipelines (Конвейеры). Выберите действие создания конвейера сборки.
- Пройдите через шаги мастера, выбрав GitHub в качестве расположения исходного кода.
- Возможно, вам придется выполнить вход в GitHub. Для этого введите учетные данные GitHub.
- Когда появится список репозиториев, выберите репозиторий с примером приложения.
- Azure Pipelines проанализирует этот репозиторий и предложит рекомендуемый шаблон. Щелкните Save and run (Сохранить и запустить), затем выберите Commit directly to the main branch (Зафиксировать непосредственно в главной ветви) и снова щелкните Save and run (Сохранить и запустить).
- Будет выполнен новый запуск. Дождитесь завершения задания.
Примеры конвейеров сборки YAML
Для создания приложений можно использовать следующие конвейеры для соответствующего языка.
Чтобы создать YAML-файл для сборки приложения .NET, можно использовать следующий пример:
pool:
vmImage: 'windows-latest'
steps:
- script: |
dotnet restore
dotnet build --configuration Release
- task: DotNetCoreCLI@2
inputs:
command: publish
arguments: '--configuration Release --output publish_output'
projects: '*.csproj'
publishWebProjects: false
modifyOutputPath: false
zipAfterPublish: false
- task: ArchiveFiles@2
displayName: "Archive files"
inputs:
rootFolderOrFile: "$(System.DefaultWorkingDirectory)/publish_output"
includeRootFolder: false
archiveFile: "$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip"
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip'
artifactName: 'drop'
Развертывание приложения
Вы развернете задачу развертывания приложения-функции Azure версии 2 . Для этой задачи в качестве входных данных требуется подключение службы Azure. Подключение службы Azure сохраняет учетные данные для подключения из Azure Pipelines к Azure. Необходимо создать подключение, использующее федерацию удостоверений рабочей нагрузки.
Версия задачи версии 2 включает поддержку новых стеков приложений для .NET, Python и Node. Задача включает проверки предварительной подготовки сети. При возникновении проблем с предварительным развертыванием останавливается.
Чтобы развернуть службу Функции Azure, добавьте следующий фрагмент кода в конце файла azure-pipelines.yml
. Установленное по умолчанию значение appType
соответствует системе Windows. Можно указать систему Linux, указав для параметра appType
значение functionAppLinux
. Для развертывания в приложении Flex Consumption необходимо задать оба appType: functionAppLinux
и isFlexConsumption: true
.
trigger:
- main
variables:
# Azure service connection established during pipeline creation
azureSubscription: <SUBSCRIPTION_NAME>
appName: <APP_NAME>
# Agent VM image name
vmImageName: 'windows-latest'
- task: AzureFunctionApp@2 # Add this at the end of your file
inputs:
azureSubscription: <AZURE_SERVICE_CONNECTION>
appType: functionApp # this specifies a Windows-based function app
appName: $(appName)
package: $(System.ArtifactsDirectory)/**/*.zip
deploymentMethod: 'auto' # 'auto' | 'zipDeploy' | 'runFromPackage'. Required. Deployment method. Default: auto.
#Uncomment the next lines to deploy to a deployment slot
#Note that deployment slots is not supported for Linux Dynamic SKU
#deployToSlotOrASE: true
#resourceGroupName: '<RESOURCE_GROUP>'
#slotName: '<SLOT_NAME>'
Следующие шаги
- Ознакомьтесь с обзором решения "Функции Azure".
- Ознакомьтесь с обзором Azure DevOps.