我们正在使用 TeamCity 作为 CI 服务器,我们一直在思考如何实现一种安全(即人为错误的可能性最小)但需要尽可能少的努力的版本控制方法。到目前为止,以下似乎是最合乎逻辑的:
- 创建版本文件(或使用程序集信息.cs)。版本信息将采用格式....此文件将签入我的 VCS 中。
- 运行团队城市构建
- TeamCity 从步骤 1 中读取版本文件,挑选出每个单独的数字并设置相应的 TeamCity 构建参数(以便我稍后可以使用它们来创建 nuget 包和标记等操作)
- TeamCity 自动递增最终的"构建计数"值。
- TeamCity 将新版本信息保存回版本文件(使用更新的"构建计数")
- 然后,TeamCity 将运行我的其余构建步骤、构建文件、运行单元测试、设置正确的程序集版本等。
- TeamCity 最终将文件签回 VCS
我们认为,这样做的好处是,如果我们需要修复旧版本,那么版本号将是正确的,TeamCity 可以简单地使用旧版本文件,并像往常一样增加构建计数。这确实假设我们正在正确更新主要/次要/补丁版本。这有望与即将发布的TeamCity 7.1功能很好地配合使用,该功能允许您通过自定义构建对话框选择要构建的分支。
从我到目前为止已经读到的内容来看,这些操作在 TeamCity 中应该是可能的,但我们正在寻找最简单的根来解决这个问题,因为我们只是一个两人的装备,我们不能投入大量时间成为 Nant 或 powershell 的专家,只是发现它可能不会做我们想要的。
所以我想总结一下我的问题如下:
- 我的建议可能吗?
- 如果是,那么鉴于我对 Nant、powershell 等的有限经验,使用的最佳工具是什么(即,对于命令行和脚本经验扩展到简单的 DOS 操作和一点 VBScript 的人来说,哪个是最快的学习)
任何帮助将不胜感激。
对于您的第一个问题:是的,有可能:
- 将 .git(.svn、.hg 等)目录添加到 VCS 规则
- 在teamcity(命令行运行器)中以您喜欢的脚本语言读取构建脚本中的版本号并对其进行输入。
- 通过交互协议设置内部版本号
- 使用您喜欢的脚本语言更新版本文件中的内部版本号
- 执行构建步骤
- 执行提交和推送,你可以,因为你已经在最后一步的构建目录中有.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']"