VSTS / TFS установить переменную среды ASP.NET core

Я пытаюсь развернуть приложение ASP.NET Core в IIS с помощью VSTS со следующими задачами

введите описание изображения здесь

Однако после долгого поиска в Google и просмотра документов MS я не смог найти способ установить переменные среды для развертывания. Переменные, которые я установил в определении выпуска в области среды, не устанавливаются как переменные среды.

введите описание изображения здесь

Есть идеи, как этого добиться?


person ubi    schedule 12.12.2017    source источник
comment
На основе этой темы сообщества разработчиков. visualstudio.com/content/problem/165842/, у вас есть обходной путь, вы можете опубликовать ответ и принять его как ответ. С другой стороны, каков подробный журнал при попытке использовать мое решение?   -  person starian chen-MSFT    schedule 14.12.2017
comment
Развертывание прошло успешно, поэтому в журналах нет ошибок. Но трансформация не применяется. Интересно, это потому, что xdt:Tranform неприменимо к узлу environmentVariable? Кстати, Intellisense помечает этот атрибут как ошибку.   -  person ubi    schedule 14.12.2017


Ответы (6)


Переменные среды, которые вы устанавливаете в 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 для синтаксиса конфигурации, если вы решите пойти по этому пути.

Что-то вроде этого (в настоящее время невозможно проверить, но это должно дать вам представление - обратите внимание на пространство имен преобразования в файле преобразования и атрибуты 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>
person Kirlac    schedule 12.12.2017
comment
Спасибо - из предоставленной вами ссылки видно, что переменные среды могут быть установлены только в web.config. Теперь, как преобразовать web.config файл для каждой среды. например если у меня есть <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" /> в файле web.config, есть ли способ переопределить его для каждой среды? У меня отмечены параметры XML variable substitution и XML transformation в задаче VSTS (docs.microsoft.com/en-us/vsts/build-release/tasks/deploy/), но они не выполняют преобразование. - person ubi; 12.12.2017
comment
Прошло некоторое время с тех пор, как я работал с файлами web.config, но я считаю, что вы создаете файл для каждой среды, например. *.<EnvironmentName>.config, чтобы вы могли создать Web.config, Web.Development.config и Web.Production.config, а параметр преобразования XML построит вашу окончательную конфигурацию на основе среды (которая, я думаю, в этом случае будет определяться вашими переменными среды VSTS). См. docs.microsoft. com / en-us / vsts / build-release / tasks / - person Kirlac; 12.12.2017
comment
@ubi В основном проекте Asp.Net лучше использовать файлы appsettings.json и appsettings. [имя среды] .json, после чего можно переопределить связанное значение в appsettings.json с помощью appsettings. [имя среды] .json для среда (ASPNETCORE_ENVIRONMENT). С другой стороны, я бы посоветовал задавать отдельные вопросы в новых ветках форума. Таким образом, читатели форума могут легко узнать вопросы и ответы. - person starian chen-MSFT; 12.12.2017
comment
На самом деле проблема, с которой я столкнулся, заключается в том, что переменная (ASPNETCORE_ENVIRONMENT), которую я установил в web.config, не преобразуется. - person ubi; 12.12.2017
comment
@starian chen-MSFT Я думаю, вы неправильно поняли проблему. Ubi пытается установить переменную ASPNETCORE_ENVIRONMENT при развертывании (предположительно для загрузки правильного файла appsettings.json) - person Kirlac; 13.12.2017

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

person Tolga    schedule 21.01.2018

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

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

  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: (Пакет или папка: $(System.DefaultWorkingDirectory)\**\*.zip; установите флажок XML transformation (он основан на имени среды для поиска исходного файла преобразования)
  8. Затем файл web.[environmentname].config (например, web.QA.config) будет преобразован в файл web.config.

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

person starian chen-MSFT    schedule 13.12.2017

Другой подход к установке переменных среды (кроме использования подхода 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
person ubi    schedule 14.12.2017

Я добавляю его в качестве аргумента на этапе публикации сборки:

/p:EnvironmentName=Development

введите описание изображения здесь

Затем он будет добавлен в web.config вывода сборки.

person denyo85    schedule 15.02.2021