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

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 как пользовательский контейнер после каждой успешной сборки. Дополнительные сведения о контейнерах см. в статье Создание функции на Linux с помощью пользовательского контейнера.

Развертывание с помощью приложения-функции 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 из указанного репозитория, а затем развертывает образ.

Развертывание в слот

Вы можете настроить несколько слотов в приложении-функции. Слоты позволяют безопасно развернуть приложение и протестировать его, прежде чем сделать его доступным для клиентов.

В следующем фрагменте 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.

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@2 # Add this at the end of your file
  inputs:
    azureSubscription: <Azure service connection>
    appType: functionAppLinux # default is functionApp
    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 Name>'
    #slotName: '<Slot name>'

В этом фрагменте предполагается, что шаги сборки в файле YAML создают ZIP-архив в папке $(System.ArtifactsDirectory) агента.

Развертывание контейнера

Вы можете автоматически развернуть код в службе Функции Azure как пользовательский контейнер после каждой успешной сборки. Дополнительные сведения о контейнерах см. в статье "Работа с контейнерами и Функции Azure".

Развертывание с помощью приложения-функции 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 из указанного репозитория, а затем развертывает образ.

Развертывание в слот

Вы можете настроить несколько слотов в приложении-функции. Слоты позволяют безопасно развернуть приложение и протестировать его, прежде чем сделать его доступным для клиентов.

В следующем фрагменте YAML показано, как выполнить развертывание в промежуточном слоте, а затем переключиться на рабочий слот:

- task: AzureFunctionApp@2
  inputs:
    azureSubscription: <Azure service connection>
    appType: functionAppLinux
    appName: <Name of the Function app>
    package: $(System.ArtifactsDirectory)/**/*.zip
    deploymentMethod: 'auto'
    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.

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