Развертывание в Службе приложений с помощью Azure Pipelines

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019

Используйте Azure Pipelines для автоматического развертывания веб-приложения для Службы приложений Azure при каждой успешной сборке. Azure Pipelines позволяет создавать, тестировать и развертывать ресурсы с использованием технологий непрерывной интеграции (CI) и непрерывной поставки (CD) в Azure DevOps.

Конвейеры YAML определяются с помощью YAML-файла в репозитории. Шаг является наименьшим стандартным блоком конвейера и может быть скриптом или задачей (предварительно упакованым скриптом). Узнайте о ключевых понятиях и компонентах, составляющих конвейер.

Вы будете использовать задачу веб-приложения Azure (AzureWebApp) для развертывания в службе приложение Azure в конвейере. Для более сложных сценариев, таких как использование XML-параметров в развертывании, можно использовать задачу развертывания службы приложение Azure (AzureRmWebAppDeployment).

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

1. Создание конвейера для стека

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

Узнайте больше о поддержке экосистемы Azure Pipelines.

  1. Войдите в свою организацию Azure DevOps и откройте нужный проект.

  2. Выберите Конвейеры, а затем — Новый конвейер.

  3. При появлении запроса выберите расположение исходного кода: Azure Repos Git или GitHub.

    Возможно, вам придется выполнить вход в GitHub. Для этого введите учетные данные GitHub.

  4. Когда появится список репозиториев, выберите свой репозиторий.

  5. Вы можете перенаправиться на GitHub, чтобы установить приложение Azure Pipelines. В этом случае выберите " Утвердить" и "Установить".

  6. Когда появится вкладка Настройка, выберите на ней ASP.NET Core.

  7. Когда появится новый конвейер, просмотрите YAML, чтобы узнать функциональность. Когда будете готовы, выберите Сохранить и запустить.

2. Добавление задачи развертывания

  1. Щелкните конец ФАЙЛА YAML, а затем выберите "Показать помощник".

  2. Используйте помощник по задачам, чтобы добавить задачу веб-приложения Azure.

    Screenshot of Azure web app task.

    Кроме того, можно добавить задачу развертывания службы приложение Azure (AzureRmWebAppDeployment).

  3. Выберите подписку Azure. Обязательно авторизуйте подключение. Авторизация создает необходимое подключение к службе.

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

    variables:
      buildConfiguration: 'Release'
    
    steps:
    - script: dotnet build --configuration $(buildConfiguration)
      displayName: 'dotnet build $(buildConfiguration)'
    - task: DotNetCoreCLI@2
      inputs:
        command: 'publish'
        publishWebProjects: true
    - task: AzureWebApp@1
      inputs:
        azureSubscription: '<service-connection-name>'
        appType: 'webAppLinux'
        appName: '<app-name>'
        package: '$(System.DefaultWorkingDirectory)/**/*.zip'
    
    • azureSubscription: имя авторизованного подключения службы к подписке Azure.
    • appName: имя существующего приложения.
    • пакет: путь к пакету или папке, содержащей содержимое службы приложений. Поддерживаются подстановочные знаки.

Пример. Развертывание приложения .NET

Чтобы развернуть веб-пакет .zip (например, из веб-приложения ASP.NET) в веб-приложении Azure, используйте следующий фрагмент кода для развертывания сборки в приложении.

variables:
  buildConfiguration: 'Release'

steps:
- script: dotnet build --configuration $(buildConfiguration)
  displayName: 'dotnet build $(buildConfiguration)'
- task: DotNetCoreCLI@2
  inputs:
    command: 'publish'
    publishWebProjects: true
- task: AzureWebApp@1
  inputs:
    azureSubscription: '<service-connection-name>'
    appType: 'webAppLinux'
    appName: '<app-name>'
    package: '$(System.DefaultWorkingDirectory)/**/*.zip'
  • azureSubscription: ваша подписка Azure.
  • appType: ваш тип веб-приложения.
  • appName: имя существующей службы приложений.
  • package: путь к файлу пакета или папке, содержащим содержимое службы приложений. Поддерживаются подстановочные знаки.

Пример: развертывание в виртуальном приложении

По умолчанию развертывание выполняется в корневое приложение в веб-приложении Azure. Вы можете развернуть в определенном виртуальном приложении с помощью VirtualApplication свойства задачи развертывания службы приложение Azure (AzureRmWebAppDeployment):

- task: AzureRmWebAppDeployment@4
  inputs:
    VirtualApplication: '<name of virtual application>'

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

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

- task: AzureWebApp@1
  inputs:
    azureSubscription: '<service-connection-name>'
    appType: webAppLinux
    appName: '<app-name>'
    deployToSlotOrASE: true
    resourceGroupName: '<name of resource group>'
    slotName: staging
    package: '$(Build.ArtifactStagingDirectory)/**/*.zip'

- task: AzureAppServiceManage@0
  inputs:
    azureSubscription: '<service-connection-name>'
    appType: webAppLinux
    WebAppName: '<app-name>'
    ResourceGroupName: '<name of resource group>'
    SourceSlot: staging
    SwapWithProduction: true
  • azureSubscription: ваша подписка Azure.
  • appType: (необязательно) использовать webAppLinux для развертывания в веб-приложении в Linux.
  • appName: имя существующей службы приложений.
  • deployToSlotOrASE: логическое значение. Развертывание в существующем слоте развертывания или в среде Службы приложений Azure.
  • resourceGroupName: имя группы ресурсов. Является обязательным, если параметр deployToSlotOrASE равен true.
  • имя слота: имя слота, в котором по умолчанию используется productionзначение . Является обязательным, если параметр deployToSlotOrASE равен true.
  • package: путь к файлу пакета или папке, содержащим содержимое службы приложений. Поддерживаются подстановочные знаки.
  • SourceSlot: слот, отправляемый в рабочую среду, когда SwapWithProduction имеет значение true.
  • SwapWithProduction: логическое значение. Переключить трафик исходного слота на рабочую среду.

Пример. Развертывание в нескольких веб-приложениях

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

jobs:
- job: buildandtest
  pool:
    vmImage: ubuntu-latest
 
  steps:
  # publish an artifact called drop
  - task: PublishPipelineArtifact@1
    inputs:
      targetPath: '$(Build.ArtifactStagingDirectory)' 
      artifactName: drop
  
  # deploy to Azure Web App staging
  - task: AzureWebApp@1
    inputs:
      azureSubscription: '<service-connection-name>'
      appType: <app type>
      appName: '<staging-app-name>'
      deployToSlotOrASE: true
      resourceGroupName: <group-name>
      slotName: 'staging'
      package: '$(Build.ArtifactStagingDirectory)/**/*.zip'

- job: deploy
  dependsOn: buildandtest
  condition: succeeded()

  pool: 
    vmImage: ubuntu-latest  
  
  steps:
    # download the artifact drop from the previous job
  - task: DownloadPipelineArtifact@2
    inputs:
      source: 'current'
      artifact: 'drop'
      path: '$(Pipeline.Workspace)'

  - task: AzureWebApp@1
    inputs:
      azureSubscription: '<service-connection-name>'
      appType: <app type>
      appName: '<production-app-name>'
      resourceGroupName: <group-name>
      package: '$(Pipeline.Workspace)/**/*.zip'

Пример. Создание подстановок переменных

Для стеков большинства языков параметры приложения и строки подключения можно задать как переменные среды во время выполнения.

Но есть и другие причины, по которым вы хотите сделать подстановки переменных в конфигурацию Web.config. В этом примере файл конфигурации Web.config содержит строка подключения с именемconnectionString. Перед развертыванием в каждом веб-приложении можно изменить его значение. Это можно сделать, применив преобразование Web.config или заменив переменные в файле Web.config.

В следующем фрагменте кода показан пример подстановки переменных с помощью задачи развертывания службы приложение Azure (AzureRmWebAppDeployment).

jobs:
- job: test
  variables:
    connectionString: <test-stage connection string>
  steps:
  - task: AzureRmWebAppDeployment@4
    inputs:
      azureSubscription: '<Test stage Azure service connection>'
      WebAppName: '<name of test stage web app>'
      enableXmlVariableSubstitution: true

- job: prod
  dependsOn: test
  variables:
    connectionString: <prod-stage connection string>
  steps:
  - task: AzureRmWebAppDeployment@4
    inputs:
      azureSubscription: '<Prod stage Azure service connection>'
      WebAppName: '<name of prod stage web app>'
      enableXmlVariableSubstitution: true

Пример: условное развертывание

Для этого в YAML можно использовать один из следующих методов:

  • Выделите шаги развертывания в отдельное задание и добавьте условие в это задание.
  • Добавьте условие к этапу.

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

- task: AzureWebApp@1
  condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
  inputs:
    azureSubscription: '<service-connection-name>'
    appName: '<app-name>'

Дополнительные сведения об условиях приведены в статье Задание условий.

Пример: развертывание с помощью веб-развертывания

Задача развертывания службы приложение Azure (AzureRmWebAppDeployment) может развертываться для Служба приложений с помощью веб-развертывания.

trigger:
- main

pool:
  vmImage: windows-latest

variables:
  buildConfiguration: 'Release'

steps:
- script: dotnet build --configuration $(buildConfiguration)
  displayName: 'dotnet build $(buildConfiguration)'
- task: DotNetCoreCLI@2
  inputs:
    command: 'publish'
    publishWebProjects: true
    arguments: '--configuration $(buildConfiguration)'
    zipAfterPublish: true
- task: AzureRmWebAppDeployment@4
  inputs:
    ConnectionType: 'AzureRM'
    azureSubscription: '<service-connection-name>'
    appType: 'webApp'
    WebAppName: '<app-name>'
    packageForLinux: '$(System.DefaultWorkingDirectory)/**/*.zip'
    enableCustomDeployment: true
    DeploymentType: 'webDeploy'

Часто задаваемые вопросы

Какова разница между AzureWebApp задачами и AzureRmWebAppDeployment задачами?

Задача веб-приложения Azure (AzureWebApp) — это самый простой способ развертывания в веб-приложении Azure. По умолчанию развертывание выполняется в корневое приложение в веб-приложении Azure.

Задача развертывания службы приложение Azure (AzureRmWebAppDeployment) может обрабатывать дополнительные пользовательские сценарии, например:

Примечание.

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

Я получаю сообщение "Недопустимый Служба приложений пакет или путь к папке предоставлен".

В конвейерах YAML в зависимости от конвейера может возникнуть несоответствие между местом сохранения созданного веб-пакета и местом поиска задачи развертывания. Например, AzureWebApp задача выбирает веб-пакет для развертывания. Например, задача AzureWebApp выглядит в $(System.DefaultWorkingDirectory)/**/*.zip. Если веб-пакет помещается в другое место, измените значение package.

Я получаю сообщение "Публикация с помощью параметров webdeploy поддерживается только при использовании агента Windows".

Эта ошибка возникает в задаче AzureRmWebAppDeployment при настройке задачи для развертывания с помощью веб-развертывания, но агент не работает под управлением Windows. Убедитесь, что в YAML есть что-то подобное следующему коду:

pool:
  vmImage: windows-latest

Веб-развертывание не работает при отключении базовой проверки подлинности

Сведения об устранении неполадок при проверке подлинности идентификатора Microsoft Entra для работы с AzureRmWebAppDeployment задачей см. в статье "Не удается выполнить веб-развертывание в службе приложение Azure" с помощью проверки подлинности идентификатора Microsoft Entra из моего агента Windows

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