如何将参数从powershell脚本传递到TFS 2013构建?

时间:2015-09-21 12:25:40

标签: powershell tfs build build-definition build-numbers

我们正在使用TFS Build 2013,我正在配置我们的构建策略。我们希望将其保持为默认值,因此我们希望使用默认的构建过程模板而不进行任何自定义活动。相反,我们有一些Powershell脚本,它们连接到默认模板。其中一个脚本从要构建的项目中提取版本号。

问题:我想在构建号中解析这个版本号,这样我们的构建就有一个很好且有意义的名称(例如Project - 2.1.2.46),我们不必每次发布都改变构建定义。 / p>

我基本上想要实现的是,我的构建脚本(下面)的结果用作构建号(格式)。

# Enable -Verbose option
[CmdletBinding()]
# Disable parameter
# Convenience option so you can debug this script or disable it in 
# your build definition without having to remove it from
# the 'Post-build script path' build process parameter.
param([switch]$Disable)
if ($PSBoundParameters.ContainsKey('Disable'))
{
    Write-Verbose "Script disabled; no actions will be taken on the files."
}

# Regular expression pattern to find the version in the assemblies 
# and then apply it to the build number
$AssemblyFileVersionRegex = 'AssemblyFileVersion\("\d+\.\d+\.\d+\.\d+"'

# Make sure path to source code directory is available
if (-not $Env:TF_BUILD_SOURCESDIRECTORY)
{
    Write-Error ("TF_BUILD_SOURCESDIRECTORY environment variable is missing.")
    exit 1
}
elseif (-not (Test-Path $Env:TF_BUILD_SOURCESDIRECTORY))
{
    Write-Error "TF_BUILD_SOURCESDIRECTORY does not exist: $Env:TF_BUILD_SOURCESDIRECTORY"
    exit 1
}
Write-Verbose "TF_BUILD_SOURCESDIRECTORY: $Env:TF_BUILD_SOURCESDIRECTORY"

# Make sure build definition name is available
if (-not $Env:TF_BUILD_BUILDDEFINITIONNAME)
{
    Write-Error ("TF_BUILD_BUILDDEFINITIONNAME environment variable is missing.")
    exit 1
}

# Apply the version to the assembly property files
$files = gci $Env:TF_BUILD_SOURCESDIRECTORY -recurse -include "*Properties*", "Solution Items" | 
    ?{ $_.PSIsContainer } | 
    foreach { gci -Path $_.FullName -Recurse -include CommonAssemblyInfo.*, AssemblyInfo.* }
if($files)
{
    foreach ($file in $files) {

        if(-not $Disable)
        {
            $fileContent = Get-Content $file
            $found = $fileContent -match $AssemblyFileVersionRegex

            if ($found) 
            {
                Write-Verbose "Found in files: $found"

                $VersionData = $found -replace [Regex]::Escape('[assembly: AssemblyFileVersion("'), ''
                $VersionData = $VersionData -replace [Regex]::Escape('")]'), ''
                Write-Verbose "Will apply $VersionData to build number"

                $Env:TF_BUILD_BUILDNUMBER = $Env:TF_BUILD_BUILDDEFINITIONNAME + ' - ' + $VersionData
                Write-Verbose "TF_BUILD_BUILDNUMBER: $Env:TF_BUILD_BUILDNUMBER"

                exit 0
            } 
            else
            {
                Write-Warning "No version number found in files. Build number will not be changed."   
            }         
        }
    }
}
else
{
    Write-Warning "Found no files."
}

打开详细日志记录后,我可以看到我的powershell脚本在TF_BUILD_BUILDNUMBER变量中解析了正确的版本号。所以,这表明我的脚本正在运行。但是,构建完成后,构建号将更改回其默认值,该值在构建定义中提供。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

您可以修改您的powershell脚本并检查最新的文件夹(构建文件夹)名称。假设姓氏是1.2.45,那么在您的powershell脚本中,您可以将其增加一个次要版本号。

答案 1 :(得分:0)

我自己找到了答案:无法更新环境变量,例如: TF_BUILD_BUILDNUMBER,使用PowerShell并再次使用构建中的更新值。它将始终回退到默认值,默认值是在触发构建时定义的。