Управление релизами многое дает для развития 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
. Без этого небольшого снижения риска (затрат) округ будет тратить тысячи долларов каждый раз, когда кто-то забывает вручную обновить два файла с одним и тем же изменением.
Спасибо за чтение!
Мик