团队城市从版本文件中读取和更新版本号



我们正在使用 TeamCity 作为 CI 服务器,我们一直在思考如何实现一种安全(即人为错误的可能性最小)但需要尽可能少的努力的版本控制方法。到目前为止,以下似乎是最合乎逻辑的:

  1. 创建版本文件(或使用程序集信息.cs)。版本信息将采用格式....此文件将签入我的 VCS 中。
  2. 运行团队城市构建
  3. TeamCity 从步骤 1 中读取版本文件,挑选出每个单独的数字并设置相应的 TeamCity 构建参数(以便我稍后可以使用它们来创建 nuget 包和标记等操作)
  4. TeamCity 自动递增最终的"构建计数"值。
  5. TeamCity 将新版本信息保存回版本文件(使用更新的"构建计数")
  6. 然后,TeamCity 将运行我的其余构建步骤、构建文件、运行单元测试、设置正确的程序集版本等。
  7. TeamCity 最终将文件签回 VCS

我们认为,这样做的好处是,如果我们需要修复旧版本,那么版本号将是正确的,TeamCity 可以简单地使用旧版本文件,并像往常一样增加构建计数。这确实假设我们正在正确更新主要/次要/补丁版本。这有望与即将发布的TeamCity 7.1功能很好地配合使用,该功能允许您通过自定义构建对话框选择要构建的分支。

从我到目前为止已经读到的内容来看,这些操作在 TeamCity 中应该是可能的,但我们正在寻找最简单的根来解决这个问题,因为我们只是一个两人的装备,我们不能投入大量时间成为 Nant 或 powershell 的专家,只是发现它可能不会做我们想要的。

所以我想总结一下我的问题如下:

  1. 我的建议可能吗?
  2. 如果是,那么鉴于我对 Nant、powershell 等的有限经验,使用的最佳工具是什么(即,对于命令行和脚本经验扩展到简单的 DOS 操作和一点 VBScript 的人来说,哪个是最快的学习)

任何帮助将不胜感激。

对于您的第一个问题:是的,有可能:

  1. 将 .git(.svn、.hg 等)目录添加到 VCS 规则
  2. 在teamcity(命令行运行器)中以您喜欢的脚本语言读取构建脚本中的版本号并对其进行输入。
  3. 通过交互协议设置内部版本号
  4. 使用您喜欢的脚本语言更新版本文件中的内部版本号
  5. 执行构建步骤
  6. 执行提交和推送,你可以,因为你已经在最后一步的构建目录中有.git(.svn,.hg等)目录

抱歉,我无法回答您的第二个问题,因为我不知道任何合适的Windows工具。在Linux上,我会使用bash。

使用 PowerShell 运行程序类型添加生成步骤

将"脚本"字段设置为"源代码"

"脚本源"字段中,输入以下内容:

# Get AssemblyInfo file's contents
$file = "GlobalAssemblyInfo.cs"
$contents = get-content $file -Raw
# Regex to get the version number from AssemblyInfo file contents
$regex = new-object System.Text.RegularExpressions.Regex ('(^s*[s*assemblys*:s*((Systems*.)?s*Reflections*.)?s*AssemblyVersion(Attribute)?s*(s*@?")(?<version>.*?)("s*)s*])', [System.Text.RegularExpressions.RegexOptions]::MultiLine)
# Get the version number
$version = $regex.Match($contents).Groups["version"].Value
# Update TeamCity buildNumber parameter using stdout
echo "##teamcity[buildNumber '$($version)']"

如果有人正在使用 Directory.Build.props 文件,您可以在 PowerShell 运行器中使用此脚本:

$fileName = "Directory.Build.props"
$currentBuildNumber = "%build.counter%"
# Get the version number, expected format is: 1.0.0.*
[xml]$xml = Get-Content -Path $fileName
[string]$version = $xml.Project.PropertyGroup.Version
$newVersion = $version.Replace('*',$currentBuildNumber).Trim()
Write-Host "##teamcity[buildNumber '$newVersion']"

相关内容

  • 没有找到相关文章