Преобразование XML DevOps Azure во время выпуска не работает
Я хочу настроить наш конвейер так, чтобы одна сборка могла использоваться для нескольких сред без необходимости создавать отдельные сборки. Согласно документам, кажется, что это возможно, так как сказано:
- Вы можете использовать эту технику, чтобы создать пакет по умолчанию и развернуть его в несколько этапов.
Я назвал свою сцену своей средой (предварительный просмотр) и создал файл web.config для этого файла среды (web.preview.config). Все мои файлы конфигурации среды находятся по тому же пути, что и файл Web.Config.
В журналах говорится, что преобразование завершено:
2018-11-17T00: 26: 52.0383966Z [команда]D:\a_tasks\AzureRmWebAppDeployment_497d490f-eea7-4f2b-ab94-48d9c1acdcb1\3.4.13\ctt\ctt.exe s:D:\a_temp\temp_web_15985 a\1\s\Microsoft.Xbox.Mvp\Microsoft.Xbox.Mvp.Api\obj\Preview\Package\PackageTmp\bin\Web.config t:D:\a_temp\temp_web_package_06958915987488234\Content\D_C\a\1\s\Microsoft.Xbox.Mvp\Microsoft.Xbox.Mvp.Api\obj\Preview\Package\PackageTmp\bin\Web.Release.config d:D:\a_temp\temp_web_package_06958915987488234\Content\D_C\a\1\s\ s Microsoft.Xbox.Mvp\Microsoft.Xbox.Mvp.Api\obj\Preview\Package\PackageTmp\bin\Web.config pw i 2018-11-17T00:26:52.4335280Z [команда]D:\a_tasks\AzureRmWebAppDeployment_497d490f-eea7-4f2b-ab94-48d9c1acdcb1\3.4.13\ctt\ctt.exe s:D:\a_temp\temp_web_package_06958915987488234\Content\D_C\a\1\s\Microsoft.Xbox.Mvp\Microsoft.Xbox.Mvp.Api\obj\Preview\Package\PackageTmp\bin\Web.config t:D:\a_temp\temp_web_package_06958915987488234\Content\D_C\a\1\s\Microsoft.Xbox.Mvp\Microsoft.Xbox.Mvp.Api\obj\Preview\Package\PackageTmp\bin\Web.Preview.config d:D:\a_temp\temp_web_package_06958915987488234\Content\D_C\a\1\s\Microsoft.Xbox.Mvp\Microsoft.Xbox.Mvp.Api\obj\Preview\Package\PackageTmp\bin\Web.config pw i 2018-11-17T00:26:52.5443873Z Преобразования XML успешно применены
Я вижу, что сначала он преобразуется в релиз, а затем применяется предварительный просмотр, как говорит документ (релиз, затем среда). Однако, хотя в нем говорится, что преобразования XML успешно применены, при проверке переменных конфигурации они не изменяются. Единственный способ заставить преобразование работать, это определить переменную buildConfiguration, когда я ставлю в очередь новую сборку, которая не позволяет мне использовать одну и ту же сборку для разных сред.
Когда я занимался исследованиями, я нашел это по этой ссылке:
Web.config преобразуется в процессе сборки, если вы сгенерировали пакет развертывания из "Build", а затем развернули его в "Release", то вы не сможете преобразовать его перед развертыванием.
Но в документе сказано, что я могу использовать один пакет по умолчанию для нескольких этапов... Означает ли это, что я должен создать отдельную сборку для каждой среды? Разве преобразование XML - это не то, на что мне следует обращать внимание в сценарии, который я хочу решить?
Заранее спасибо!
++ Редактировать:
Настройки релиза: ReleaseSettings
Выпуск шагов (я думаю? У меня есть сильное чувство, что это то, что вы ищете...): ReleaseSteps
1 ответ
1) Убедитесь, что вы трансформируете произведения. Проверьте это здесь.
2) Убедитесь, что в вашем проекте VS вы включаете файл transform, Web.Preview.config и копируете в выходной каталог.
3) Отключите config config во время сборки, вам просто нужно добавить аргумент /p:TransformWebConfigEnabled=False в разделе Аргументы MSBuild вашей задачи Build. Вам также необходимо добавить /p:AutoParameterizationWebConfigConnectionStrings=False, если вы хотите обновить строку подключения во время выпуска. Это будет использовать Web.Preview.config для "преобразования" web.config.
4) Дважды проверьте, что в вашем выпуске для задачи IIS Web App Deploy в разделе "Преобразования файлов и параметры подстановки переменных" проверена трансформация XML.
Ни один из ответов, которые я нашел в Интернете, не помог мне сам по себе для моего конвейера сборки и выпуска. В
web.config
Я получал из конвейера выпуска всегда указывал на непреобразованные значения.
Однако после нескольких часов выдергивания волос все заработало.
Краткая информация о моей настройке
Я хочу иметь возможность развертывать во всех средах с помощью только одной сборки и одного конвейера выпуска.
Моя установка:
- Один конвейер сборки, который собирает все наши стандартные ветки (тестовая,выпускная,основная).
- Один конвейер выпуска, который имеет разные этапы в зависимости от ветки, в которой запущен выпуск.
Наш тестовый этап выпускает тестовую ветку на нашем тестовом сервере. Stage/Production происходит из той же ветки выпуска, но имеет собственные файлы преобразования.
Решение
Я выполнил некоторые инструкции от Microsoft и настроил
web.<environment_name>.config
чтобы соответствовать названиям этапов выпуска.
Мне не нужно было удалять
<Dependent Upon>
ряды от моего
.csproj
для каждого преобразования. Вместо этого все, что я сделал, это установил для свойства Build Action каждого преобразования значение Content, как показано на изображении ниже.
Затем я добавил эти команды в Build Solution -> MSBuild в конвейере сборки:
-
/p:MarkWebConfigAssistFilesAsExclude=false
-
/p:TransformWebConfigEnabled=false
-
/p:AutoParameterizationWebConfigConnectionStrings=False
Сборка теперь не пытается преобразовать
.config
сам по себе, а также не исключает файлы преобразования из артефакта, позволяя конвейеру выпуска вместо этого выполнять преобразование. Кроме того, сохраняя
<Dependent On>
для файлов преобразования позволяет нам "чище" заглянуть внутрь редакторов кода.
Я просто заработал, чтобы у меня была одна сборка с развертыванием в нескольких средах. Это то, что я сделал.
В коде я установил для каждого свойства Web..config значение Build Action = "Content". Я также установил все мои копировать в выходной каталог = "Копировать всегда". Я также выгрузил проект и отредактировал файл csproj, затем удалил строки Web.config. Это сбрасывает все ваши web.configs в корень (без вложенности файлов).
В сборке я установил переменную конвейера BuildConfiguration = "Release". У меня нет проекта Web.Release.config в моем проекте.
В этом выпуске я назвал этап развертывания после среды (в моем случае, "Разработка", "Подготовка" и "Производство"). На всех этапах в задаче развертывания Azure я установил флажок преобразования XML.
В Azure я установил для ASPNETCORE_ENVIRONMENT наименование промежуточной среды, в моем случае - "Разработка", "Подготовка" и "Производство").
Я только что получил это работает. Моя проблема была на самом деле на уровне решения Visual Studio. У меня проект MVC указывал на конфигурацию, отличную от других. Так что всегда перепроверяйте конфиги!