Развертывание в Службе приложений с помощью 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-параметров в развертывании, можно использовать задачу развертывания службы приложение Azure (AzureRmWebAppDeployment).
Необходимые компоненты
- Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .
- Организация Azure DevOps. Создайте ее бесплатно.
- Возможность запуска конвейеров на размещенных агентах Майкрософт. Вы можете приобрести параллельное задание или запросить уровень "Бесплатный".
- Работающее приложение Службы приложений Azure с кодом, размещенным на GitHub или в Azure Repos.
- .NET: Создание веб-приложения ASP.NET Core в Azure.
- ASP.NET: Создание веб-приложения ASP.NET Framework в Azure.
- JavaScript: Создание веб-приложения Node.js в Службе приложений Azure.
- Java: Создание приложения Java в Службе приложений Azure.
- Python: Создание приложения Python в Службе приложений Azure.
1. Создание конвейера для стека
В примерах кода в этом разделе предполагается, что вы развертываете веб-приложение ASP.NET. Инструкции можно адаптировать для других платформ.
Узнайте больше о поддержке экосистемы Azure Pipelines.
Войдите в свою организацию Azure DevOps и откройте нужный проект.
Выберите Конвейеры, а затем — Новый конвейер.
При появлении запроса выберите расположение исходного кода: Azure Repos Git или GitHub.
Возможно, вам придется выполнить вход в GitHub. Для этого введите учетные данные GitHub.
Когда появится список репозиториев, выберите свой репозиторий.
Вы можете перенаправиться на GitHub, чтобы установить приложение Azure Pipelines. В этом случае выберите " Утвердить" и "Установить".
Когда появится вкладка Настройка, выберите на ней ASP.NET Core.
Когда появится новый конвейер, просмотрите YAML, чтобы узнать функциональность. Когда будете готовы, выберите Сохранить и запустить.
2. Добавление задачи развертывания
Щелкните конец ФАЙЛА YAML, а затем выберите "Показать помощник".
Используйте помощник по задачам, чтобы добавить задачу веб-приложения Azure.
Кроме того, можно добавить задачу развертывания службы приложение Azure (AzureRmWebAppDeployment).
Выберите подписку Azure. Обязательно авторизуйте подключение. Авторизация создает необходимое подключение к службе.
Выберите тип приложения, имя приложения и стек среды выполнения на основе приложения Служба приложений. Полный 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: имя существующего приложения.
- пакет: путь к пакету или папке, содержащей содержимое службы приложений. Поддерживаются подстановочные знаки.
Пример. Развертывание приложения .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>'
- VirtualApplication: имя виртуального приложения, настроенного в портал Azure. Дополнительные сведения см. в разделе "Настройка приложения Служба приложений" в портал Azure.
Пример. Развертывание в слоте
В примере ниже показано, как выполнить развертывание в промежуточном слоте, а затем переключиться на рабочий слот:
- 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:
- 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
) может обрабатывать дополнительные пользовательские сценарии, например:
- Измените параметры конфигурации в веб-пакетах и XML-файлах параметров.
- Развертывание с помощью веб-развертывания, если вы используете процесс развертывания IIS.
- Развертывание в виртуальных приложениях.
- Развертывание в других типах приложений, таких как приложения-контейнеры, приложения-функции, веб-задания или API и мобильные приложения.
Примечание.
Преобразования файлов и подстановка переменных также поддерживаются отдельной задачей преобразования файлов для использования в 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
Следующие шаги
- Настройте конвейер Azure DevOps.