Поделиться через


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

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

Примечание.

Начиная с 1 июня 2024 года только что созданные приложения службы приложений могут создать уникальное имя узла по умолчанию, использующее соглашение об именовании <app-name>-<random-hash>.<region>.azurewebsites.net. Например: myapp-ds27dh7271aah175.westus-01.azurewebsites.net. Существующие имена приложений остаются неизменными.

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

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

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

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

Необходимые условия:

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 .

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

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

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

    variables:
      buildConfiguration: 'Release'
    
    steps:
    - 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: имя существующего приложения.
    • package: путь к пакету или папке, содержащей содержимое службы приложений. Поддерживаются подстановочные знаки.

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

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

variables:
  buildConfiguration: 'Release'

steps:
- 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.
  • slotName: имя слота, для которого используется значение productionпо умолчанию. Является обязательным, если параметр deployToSlotOrASE равен true.
  • package: путь к пакету или папке, содержащей содержимое службы приложений. Поддерживаются подстановочные знаки.
  • SourceSlot: слот отправляется в производственную среду, если SwapWithProduction истинно.
  • 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'

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

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

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

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

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

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

Пример: Развертывание с использованием Web Deploy

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

trigger:
- main

pool:
  vmImage: windows-latest

variables:
  buildConfiguration: 'Release'

steps:
- 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 Web AppAzureWebApp — это самый простой способ развертывания на веб-приложении 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".