VSTS/TFS установить переменную среды ядра ASP.NET
Я пытаюсь развернуть приложение ASP.NET Core в IIS с помощью VSTS, выполнив следующие задачи
Однако, после долгих поисков в Google MS документах, я не смог найти способ установки переменных среды для развертывания. Переменные, которые я установил в определении выпуска в области видимости среды, не устанавливаются как переменные среды.
Есть идеи, как этого добиться?
6 ответов
Другой подход к настройке переменных среды (кроме использования XML transform
подход), чтобы добавить задачу Powershell, которая использует appCmd
команда для установки переменных среды в области ApplicationPool
C:\Windows\system32\inetsrv\appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='XyzPool'].environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Dev']" /commit:apphost
Переменные среды, которые вы устанавливаете в VSTS, просто используются для самого развертывания (т. Е. Все, что делает VSTS, например, создание вашего приложения или выполнение модульных тестов), но исполняемое приложение будет использовать те, которые находятся на сервере, на котором он размещен.
Вам нужно будет установить переменные среды на сервере IIS, на котором развертывается VSTS, если вы хотите, чтобы развернутое приложение также использовало их. Документы Microsoft показывают, как установить это в зависимости от вашего сервера: Настройка среды
Обновление в ответ на комментарии:
Рекомендованный способ установки переменных окружения находится на самой машине - т.е. Войдите на сервер IIS, на котором вы развертываете, и добавьте ASPNETCORE_ENVIRONMENT
переменная среды там в system properties -> advanced settings -> environment variables
Если по какой-либо причине вы не можете сделать это, вы можете установить их в Web.config
файл (согласно этой документации). Если вы всегда устанавливаете одно и то же значение, вы можете просто поместить то, что вам нужно, в Web.config
вот так
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
</environmentVariables>
Если вам действительно нужны преобразования XML (что, честно говоря, я не уверен, что вы делаете в этой ситуации - это для изменения Web.config
файл во время развертывания на основе конфигурации сборки. Как кто-то еще упомянул, с ядром asp.net рекомендованная конфигурация конфигурации appsettings[.environment].json
файлы, которые автоматически загружаются на основе соответствующего уровня машины ASPNETCORE_ENVIRONMENT
переменная env), вам нужно фактически определить преобразования в файле преобразования, используя правильный синтаксис, и заставить его заменить части, которые вы хотите изменить. Это, очевидно, более сложный вариант.
См. Практическое руководство. Преобразование Web.config при развертывании проекта веб-приложения для создания файлов преобразования и синтаксиса преобразования Web.config для развертывания веб-проекта Использование Visual Studio для синтаксиса конфигурации, если вы решите пойти по этому пути.
Примерно так (не в состоянии в настоящее время проверить, но это должно дать вам представление - обратите внимание на пространство имен transform в файле transform и xdt:
атрибуты). Я полагаю, что загружаемый файл преобразования соответствует конфигурации сборки, которую вам может потребоваться настроить как часть задачи VSTS:
Web.config
<configuration>
<system.webServer>
<aspNetCore ...>
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
</environmentVariables>
</aspNetCore>
</system.webServer>
</configuration>
Web.Release.config (файл преобразования для конфигурации сборки "Release")
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<system.webServer>
<aspNetCore ...>
<environmentVariables>
<environmentVariable xdt:Transform="Replace" xdt:Locator="Match(name)" name="ASPNETCORE_ENVIRONMENT" value="Production" />
</environmentVariables>
</aspNetCore>
</system.webServer>
</configuration>
Я добавляю его в качестве аргумента на этапе сборки "Опубликовать":
/p:EnvironmentName=Development
Затем он будет добавлен в web.config вывода сборки.
Для проектов ASP.NET Core 1.x с web.config вы можете использовать ниже.
Поскольку в вашем развертывании используется среда "Dev", передайте в свой проект следующий файл конфигурации:
web.Dev.config
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<system.webServer>
<aspNetCore>
<environmentVariables xdt:Transform="InsertIfMissing" />
<environmentVariables>
<environmentVariable xdt:Transform="InsertIfMissing" xdt:Locator="Match(name)" name="ASPNETCORE_ENVIRONMENT" />
<environmentVariable xdt:Transform="Replace" xdt:Locator="Match(name)" name="ASPNETCORE_ENVIRONMENT" value="Development" />
</environmentVariables>
</aspNetCore>
</system.webServer>
</configuration>
- Приведенное выше создаст раздел environmentVariables в вашем файле web.config, если он еще не существует.
- При необходимости замените "Dev" в web.Dev.config другими именами среды.
- ASPNETCORE_ENVIRONMENT, используемый в качестве примера выше, изменяется для других переменных.
- Удалить
xmlns=""
атрибут изconfiguration
элемент выше, если ваш web.config не имеет такой же атрибут пространства имен наconfiguration
элемент.
В вашем project.json добавьте в publishOptions => include:
"web.dev.config"
В развертывании VSTS обязательно проверьте "Преобразование XML" в задаче "Развертывание IIS Web App":
Вот сценарий PowerShell, который я использую в конвейере выпуска (мне не нравится устанавливать ASPNETCORE_ENVIRONMENT в сборке)
аргументы:
-p $(System.DefaultWorkingDirectory)\$(Build.DefinitionName)\drop\testbld-Test\web.config -e Development
Встроенный скрипт:
param ([string]$p,[string]$e)
$doc = new-object System.Xml.XmlDocument
$location = "$p"
$doc.Load($location)
$subNode = $doc.CreateElement("environmentVariable")
$node = $doc.CreateElement("environmentVariables")
$doc.SelectSingleNode("//aspNetCore").AppendChild($node)
$doc.SelectSingleNode("//environmentVariables").AppendChild($subNode)
foreach($nd in $subNode) {$nd.SetAttribute("name", "ASPNETCORE_ENVIRONMENT");$nd.SetAttribute("value", "$e");}
$doc.Save($location)
Обратитесь к этим шагам ниже:
- Установить свойства файлов конфигурации (например, web.config, web.QA.config), Копировать в выходной каталог: Копировать, если новее)
- Задача.NET Core (Команда:
restore
) - .NET Core задача (команда:
build
) - Задача.NET Core (Команда:
publish
; Отметьте опцию "Публиковать веб-проекты"; Аргументы:--configuration $(BuildConfiguration) --output $(build.artifactstagingdirectory)
; ПроверьтеZip Published Projects
опция) - Опубликовать артефакты сборки (путь к публикации:
$(build.artifactstagingdirectory)
) - Определение открытого выпуска, изменение имени среды (например, QA, соответствие имени файла конфигурации)
- Задача IIS Web Deploy: (Пакет или папка:
$(System.DefaultWorkingDirectory)\**\*.zip
; ПроверьтеXML transformation
опция (она основана на имени среды для поиска исходного файла преобразования) - Тогда
web.[environmentname].config
файл (например, web.QA.config) будет преобразован вweb.config
файл.
Вы также можете сделать это с помощью задачи преобразования XDT (файлы не могут быть в zip-файле, поэтому снимите флажок Zip Published Projects
опция: step4, и архивировать файлы через Archive Files
задание в выпуске)