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": Флажок преобразования XML

Вот сценарий 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)

Обратитесь к этим шагам ниже:

  1. Установить свойства файлов конфигурации (например, web.config, web.QA.config), Копировать в выходной каталог: Копировать, если новее)
  2. Задача.NET Core (Команда: restore)
  3. .NET Core задача (команда: build)
  4. Задача.NET Core (Команда: publish; Отметьте опцию "Публиковать веб-проекты"; Аргументы: --configuration $(BuildConfiguration) --output $(build.artifactstagingdirectory); Проверьте Zip Published Projects опция)
  5. Опубликовать артефакты сборки (путь к публикации:$(build.artifactstagingdirectory))
  6. Определение открытого выпуска, изменение имени среды (например, QA, соответствие имени файла конфигурации)
  7. Задача IIS Web Deploy: (Пакет или папка: $(System.DefaultWorkingDirectory)\**\*.zip; Проверьте XML transformation опция (она основана на имени среды для поиска исходного файла преобразования)
  8. Тогда web.[environmentname].config файл (например, web.QA.config) будет преобразован в web.config файл.

Вы также можете сделать это с помощью задачи преобразования XDT (файлы не могут быть в zip-файле, поэтому снимите флажок Zip Published Projects опция: step4, и архивировать файлы через Archive Files задание в выпуске)