Управление релизами многое дает для развития DevOps. Автоматизация и контроль ваших релизов — дело непростое; этот инструмент делает это легко. Хотя исходный локальный продукт немного грубоват, он достаточно хорош для того, чтобы мы использовали его для моего текущего клиента — школьного округа, в котором обучается почти миллион учащихся.

Одной из функций управления релизами является токенизация. Это альтернатива преобразованиям Web.config, позволяющая использовать парадигму компонентов Release Manager для — в наиболее распространенном случае — определения значений web.config из различных шаблонов выпуска (соответствующих средам) через пользовательский интерфейс RM.

Однако есть проблема — это означает, что вам нужно создать файл web.config.token, а также файл web.config. Файл web.config используется разработчиками, а файл web.token.config используется RM. Когда ваша команда разработчиков вносит изменения в web.config, отделу управления релизами все равно, потому что он ищет только ваш файл .token.

Это означает, что вашим разработчикам необходимо внести изменения как в web.config, так и в web.config.token. Это далеко не идеально.

Решение? Удалите web.config и используйте web.config.token для создания предварительной сборки web.config с использованием локального файла, содержащего значения токенов. Это означает, что изменения в web.configдолжны произойти только один раз. Изменения в структуре файла или все, что не меняется между средами, будут внесены в файл web.config.token, а изменения в значениях токенов будут внесены в локальный файл значений токенов.

Как мы можем достичь вышеизложенного? Пауэршелл, детка.

Шаг 1. Добавьте файл web.tokens. Это файл XML, содержащий ключи/значения, которые вы хотите разметить:

<Root> 
   <Token> 
      <Key>Title</Key> 
      <Value>This Blog Rocks</Value> 
   </Token> 
   <Token> 
      <Key>Debug</Key> 
      <Value>true</Value> 
   </Token> 
</Root>

Шаг 2. переименуйте web.config в web.token.config и обновите значения с помощью токенов. Например:

<appSettings> 
   <add key="Title" value="__Title__" /> 
   <add key="webpages:Version" value="3.0.0.0" /> <add key="webpages:Enabled" value="false" /> 
   <add key="ClientValidationEnabled" value="true" /> 
   <add key="UnobtrusiveJavaScriptEnabled" value="true" /> </appSettings>

Шаг 3. Добавьте этот потрясающий скрипт powershell в корень вашего проекта, чтобы сгенерировать web.config для ваших локальных развертываний с помощью токенизации (имитируя то, что RM делает за кулисами):

try { 
   # get xml 
   [xml]$tokens = (New-Object System.Net.WebClient).DownloadString($tokenConfig) 
   # iterate through each line 
   $initiated = $FALSE 
   write-host Beginning iteration 
   foreach($token in $tokens.Root.Token) { 
      $key = $token.Key 
      $value = $token.Value 
      write-host Replacing __${key}__ with $value 
      
      # find and replace corresponding token in web.config 
      if ($initiated){ 
         (Get-Content $targetConfig) | 
         Foreach-Object {$_ -replace "__${key}__", "$value"} | 
         Set-Content $targetConfig 
      } else { 
         (Get-Content $tokenizedWebConfig) | 
         Foreach-Object {$_ -replace "__${key}__", "$value"} | 
         Set-Content $targetConfig 
      } 
      $initiated = $TRUE; 
   } 
} catch { 
   write-host Error hydrating $webconfig with $tokens 
}

Шаг 4. Добавьте в проект событие Pre-Build, чтобы связать все это воедино:

powershell.exe -file "$(ProjectDir)tokenize.ps1" -tokenizedWebConfig "$(ProjectDir)web.config.token" -tokenConfig "$(ProjectDir)Web.tokens" -targetConfig "$(ProjectDir)Web.config"

Вот и все — теперь вашим разработчикам не нужно беспокоиться об обновлении двух файлов с одинаковыми изменениями. Вам просто нужно обновить их процесс разработки, чтобы использовать новый файл значений токенов для изменения их значений и обновить файл token.config вместо web.config, если им нужно внести изменения в фактический web.config. Без этого небольшого снижения риска (затрат) округ будет тратить тысячи долларов каждый раз, когда кто-то забывает вручную обновить два файла с одним и тем же изменением.

Спасибо за чтение!

Мик