4

すべての単体テストを含む Visual Studio ソリューション内には、いくつかのテキスト ファイルがあります。これらのテキスト ファイルは、単体テストによって生成された結果に基づいてチェックされます。

ファイルをロードするために、次の app.config があります。

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

ビルド実行ごとに TeamCity 内で次のことを行います。

BaseTestsDataPath をエージェントの特定の作業パスに変更します。

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

エージェントの作業フォルダー内の物理的なレイアウトを知っているので、知っておく必要があるのは次のとおりです。

  • TeamCity のビルド手順でソリューションに対して Nunit を実行する前に app.config ファイルを変更する方法
4

3 に答える 3

14

これにはいくつかのアプローチがあります。

NUnit ステップを実行する前に、次のスクリプトのいずれかを選択してソース管理に追加し、ビルド構成で PowerShell ビルド ランナーをセットアップして、必要なパラメーターを渡すスクリプトを実行するだけです。オプション 2 を選択した場合は、変換 dll も考慮する必要があります。

AppSettingReplace.ps1

単一の値のみを変更したい場合は、構成ファイルを xml ドキュメントにロードし、アプリの設定を繰り返し、一致するものを変更する簡単な PowerShell を使用してこれを実現できます。

# -----------------------------------------------
# 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が何らかの方法でサーバーに配置される必要があります (通常はソース管理に入れます)。

次のスクリプトは、1 つの構成ファイルを別の構成ファイルに変換します。

# -----------------------------------------------
# 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

お役に立てれば

于 2016-05-13T08:26:29.250 に答える
4

File Content Replacerビルド機能を使用して、ビルド前にテキスト ファイルで正規表現の置換を実行できます。ビルド後、ファイルの内容を元の状態に復元します。

于 2016-05-18T12:28:57.560 に答える