Измените значение в app.config в TeamCity

В решении Visual Studio, которое содержит все наши модульные тесты, у нас есть несколько текстовых файлов. Эти текстовые файлы проверяются на основе некоторых результатов, полученных с помощью наших модульных тестов.

Для загрузки файлов у нас есть app.config с:

 <appSettings>
    <add key="BaseTestDataPath" value="D:\MyPath\MySolution\" />
 </appSettings>

В TeamCity при каждом запуске сборки я хочу:

Измените BaseTestsDataPath на конкретный рабочий путь агента, например.

C:\TeamCity\buildAgent\work\1ca1a73fe3dadf57\MySolution\

Я знаю физическую схему в рабочей папке агента, поэтому мне нужно знать следующее:

  • Как изменить файл app.config перед запуском Nunit для решения в моих этапах сборки для TeamCity

person TheEdge    schedule 13.05.2016    source источник


Ответы (3)


Есть несколько подходов к этому.

Просто выберите один из следующих сценариев, добавьте его в систему управления версиями и настройте средство выполнения сборки PowerShell в конфигурации сборки для запуска сценария с передачей необходимых параметров перед выполнением шага NUnit. Если вы выберете вариант два, вам также нужно будет рассмотреть dll преобразования.

AppSettingReplace.ps1

Если вы хотите изменить только одно значение, вы можете добиться этого с помощью некоторой простой оболочки PowerShell, которая загрузит файл конфигурации в XML-документ, выполнит итерацию настроек приложения и изменит тот, который соответствует.

# -----------------------------------------------
# Config Transform
# -----------------------------------------------
#
# Ver   Who                     When      What
# 1.0   Evolve Software Ltd     13-05-16  Initial Version

# Script Input Parameters
param (
    [ValidateNotNullOrEmpty()]
    [string] $ConfigurationFile = $(throw "-ConfigurationFile is mandatory, please provide a value."),
    [ValidateNotNullOrEmpty()]
    [string] $ApplicationSetting = $(throw "-ApplicationSetting is mandatory, please provide a value."),
    [ValidateNotNullOrEmpty()]
    [string] $ApplicationSettingValue = $(throw "-ApplicationSettingValue is mandatory, please provide a value.")
)

function Main() 
{
    $CurrentScriptVersion = "1.0"

    Write-Host "================== Config Transform - Version"$CurrentScriptVersion": START =================="

    # Log input variables passed in
    Log-Variables
    Write-Host

    try {
        $xml = [xml](get-content($ConfigurationFile))
        $conf = $xml.configuration
        $conf.appSettings.add | foreach { if ($_.key -eq $ApplicationSetting) { $_.value = $ApplicationSettingValue } }
        $xml.Save($ConfigurationFile)
    } 
    catch [System.Exception] {
        Write-Output $_
        Exit 1
    }

    Write-Host "================== Config Transform - Version"$CurrentScriptVersion": END =================="
}

function Log-Variables
{
    Write-Host "ConfigurationFile: " $ConfigurationFile
    Write-Host "ApplicationSetting: " $ApplicationSetting
    Write-Host "ApplicationSettingValue: " $ApplicationSettingValue
    Write-Host "Computername:" (gc env:computername)
}

Main

Использование

AppSettingReplace.ps1 "D: \ MyPath \ app.config" "BaseTestDataPath" "% teamcity.build.workingDir%"


XdtConfigTransform.ps1

Альтернативный подход к этому - обеспечить полную поддержку преобразования конфигурации с помощью XDT - для этого требуется, чтобы Microsoft.Web.XmlTransform.dll каким-то образом оказался на сервере (что я обычно помещаю в систему управления версиями).

Следующий скрипт преобразует один файл конфигурации в другой.

# -----------------------------------------------
# Xdt Config Transform
# -----------------------------------------------
#
# Ver   Who                     When      What
# 1.0   Evolve Software Ltd     14-05-16  Initial Version

# Script Input Parameters
param (
    [ValidateNotNullOrEmpty()]
    [string] $ConfigurationFile = $(throw "-ConfigurationFile is mandatory, please provide a value."),
    [ValidateNotNullOrEmpty()]
    [string] $TransformFile = $(throw "-TransformFile is mandatory, please provide a value."),
    [ValidateNotNullOrEmpty()]
    [string] $LibraryPath = $(throw "-LibraryPath is mandatory, please provide a value.")
)

function Main() 
{
    $CurrentScriptVersion = "1.0"

    Write-Host "================== Xdt Config Transform - Version"$CurrentScriptVersion": START =================="

    # Log input variables passed in
    Log-Variables
    Write-Host

    if (!$ConfigurationFile -or !(Test-Path -path $ConfigurationFile -PathType Leaf)) {
        throw "File not found. $ConfigurationFile";
        Exit 1
    }
    if (!$TransformFile -or !(Test-Path -path $TransformFile -PathType Leaf)) {
        throw "File not found. $TransformFile";
        Exit 1
    }

    try {

        Add-Type -LiteralPath "$LibraryPath\Microsoft.Web.XmlTransform.dll"
        $xml = New-Object Microsoft.Web.XmlTransform.XmlTransformableDocument;
        $xml.PreserveWhitespace = $true
        $xml.Load($ConfigurationFile);

        $xmlTransform = New-Object Microsoft.Web.XmlTransform.XmlTransformation($TransformFile);
        if ($xmlTransform.Apply($xml) -eq $false)
        {
            throw "Transformation failed."
        }
        $xml.Save($ConfigurationFile)
    } 
    catch [System.Exception] {
        Write-Output $_
        Exit 1
    }

    Write-Host "================== Xdt Config Transform - Version"$CurrentScriptVersion": END =================="
}

function Log-Variables
{
    Write-Host "ConfigurationFile: " $ConfigurationFile
    Write-Host "TransformFile: " $TransformFile
    Write-Host "LibraryPath: " $LibraryPath
    Write-Host "Computername:" (gc env:computername)
}

Main

Использование

XdtConfigTransform.ps1 "D: \ MyPath \ app.config" "D: \ MyPath \ app.transform.config" "% teamcity.build.workingDir% \ Library"

Примечание. Последний параметр - это путь к каталогу, в котором находится Microsoft.Web.XmlTransform.dll.

Репозиторий Github - teamcity-config-transform

Надеюсь это поможет

person Evolve Software Ltd    schedule 13.05.2016
comment
Спасибо, это именно то, что я ищу, вам нужно больше +1 для этого ответа;) - person Rippo; 21.09.2016

Вы можете использовать функцию сборки File Content Replacer для выполнения замены регулярных выражений в тексте. файлы перед сборкой. После сборки он восстанавливает содержимое файла в исходное состояние.

person Alina Mishina    schedule 18.05.2016
comment
У вас есть пример того, как использовать FCR применительно к вопросу? - person Josh Noe; 30.11.2018

При желании вы можете использовать nuget package id = "SlowCheetah". Это добавляет преобразование для app.config. При сборке он трансформируется, поэтому нет необходимости в дополнительных скриптах или dll.

person Leszek P    schedule 23.03.2017
comment
Хотя вы можете добавить этот пакет NuGet, он в конечном итоге необходим только для TC, поэтому его наличие в самом решении не обязательно. Так что это по-прежнему означает возиться с конкретной реализацией TC. Кажется, это не отличается от запуска отдельных скриптов? - person TheEdge; 23.03.2017
comment
Помогает при тестировании на ПК. У меня есть app.config.Debug, app.config.UAT, app.config.Release и т. Д., И с помощью решения для сборки он был преобразован, чтобы можно было тестировать серверы различий, базы данных и т. Д. Прямо из коробки без каких-либо дополнительных скриптов. - person Leszek P; 24.03.2017