Непрерывная поставка с помощью 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 и более ранних версий.

Необходимые компоненты

Сборка приложения

  1. Войдите в свою организацию Azure DevOps и откройте нужный проект.
  2. В этом проекте перейдите к странице Pipelines (Конвейеры). Затем нажмите New pipeline (Создать конвейер).
  3. Выберите один из следующих вариантов для вашего кода?
    • GitHub: вы можете быть перенаправлены на GitHub для входа. Для этого введите учетные данные GitHub. При первом подключении к GitHub мастер также описывает процесс подключения DevOps к учетным записям GitHub.
    • Azure Repos Git: вы сразу же сможете выбрать репозиторий в текущем проекте DevOps.
  4. Когда появится список репозиториев, выберите репозиторий с примером приложения.
  5. Azure Pipelines анализирует репозиторий и в разделе "Настройка конвейера " содержит список потенциальных шаблонов. Выберите соответствующий шаблон приложения-функции для вашего языка. Если вы не видите правильный шаблон, выберите "Показать больше".
  6. Щелкните Save and run (Сохранить и запустить), затем выберите Commit directly to the main branch (Зафиксировать непосредственно в главной ветви) и снова щелкните Save and run (Сохранить и запустить).
  7. Будет выполнен новый запуск. Дождитесь завершения задания.

Примеры конвейеров сборки 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.

Сборка приложения

  1. Войдите в свою организацию Azure DevOps и откройте нужный проект.
  2. В этом проекте перейдите к странице Pipelines (Конвейеры). Выберите действие создания конвейера сборки.
  3. Пройдите через шаги мастера, выбрав GitHub в качестве расположения исходного кода.
  4. Возможно, вам придется выполнить вход в GitHub. Для этого введите учетные данные GitHub.
  5. Когда появится список репозиториев, выберите репозиторий с примером приложения.
  6. Azure Pipelines проанализирует этот репозиторий и предложит рекомендуемый шаблон. Щелкните Save and run (Сохранить и запустить), затем выберите Commit directly to the main branch (Зафиксировать непосредственно в главной ветви) и снова щелкните Save and run (Сохранить и запустить).
  7. Будет выполнен новый запуск. Дождитесь завершения задания.

Примеры конвейеров сборки 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>'

Следующие шаги