我有一个Nant构建脚本,CruiseControl使用它来按需构建解决方案。
但是,我们最近才获得CruiseControl,因此我们的官方版本号与CruiseControl中列出的版本号不同。
我知道CruiseControl会在构建脚本中注入一些属性,以便我可以访问脚本中的CC内部版本号(CCNetLabel)但是如何将值传递回CC以用作UI屏幕上的内部版本号?
示例,CC表示内部版本号2
nAnt脚本在每次构建时增加buildnumber.xml值,官方内部版本号在123上。
我希望CC UI显示最后一个成功的内部版本号:123,而不是2,所以我该如何传递该值?
答案 0 :(得分:7)
此处需要自定义构建贴标机。 Perforce是我们的源代码控制提供商,我们从中获取版本号。代码如下:
/// <summary>
/// Gets the latest change list number from perforce, for ccnet to consume as a build label.
/// </summary>
[ReflectorType( "p4labeller" )]
public class PerforceLabeller : ILabeller
{
// perforce executable (optional)
[ReflectorProperty("executable", Required = false)]
public string P4Executable = "p4.exe";
// perforce port (i.e. myserver:1234)
[ReflectorProperty("port", Required = false)]
public string P4Port = String.Empty;
// perforce user
[ReflectorProperty("user", Required = false)]
public string P4User = String.Empty;
// perforce client
[ReflectorProperty("client", Required = false)]
public string P4Client = String.Empty;
// perforce view (i.e. //Dev/Code1/...)
[ReflectorProperty("view", Required = false)]
public string P4View = String.Empty;
// Returns latest change list
public string Generate( IIntegrationResult previousLabel )
{
return GetLatestChangelist();
}
// Stores latest change list into a label
public void Run( IIntegrationResult result )
{
result.Label = GetLatestChangelist();
}
// Gets the latest change list
public string GetLatestChangelist()
{
// Build the arguments to pass to p4 to get the latest changelist
string theArgs = "-p " + P4Port + " -u " + P4User + " -c " + P4Client + " changes -m 1 -s submitted " + P4View;
Log.Info( string.Format( "Getting latest change from Perforce using --> " + theArgs ) );
// Execute p4
ProcessResult theProcessResult = new ProcessExecutor().Execute( new ProcessInfo( P4Executable, theArgs ) );
// Extract the changelist # from the result
Regex theRegex = new Regex( @"\s[0-9]+\s", RegexOptions.IgnoreCase );
Match theMatch = theRegex.Match( theProcessResult.StandardOutput );
return theMatch.Value.Trim();
}
}
方法 GetLatestChangelist ,您可能会插入自己的逻辑与您的版本控制系统进行通信。在Perforce中,最后一个变更列表的想法是独一无二的。我们的构建号,最终版本号基于此。
一旦你构建了这个(进入程序集dll),你就必须把它挂钩到ccnet。您只需将程序集放入服务器目录(ccnet.exe旁边)即可。
接下来,修改ccnet项目文件以使用此贴标机。我们使用default labeller block完成了此操作。如下所示:
<project>
<labeller type="p4labeller">
<client>myclient</client>
<executable>p4.exe</executable>
<port>myserver:1234</port>
<user>myuser</user>
<view>//Code1/...</view>
</labeller>
<!-- Other project configuration to go here -->
</project>
如果您只是希望构建号出现在ccnet中,那么您已经完成了,并且不需要做任何其他事情。但是,如果您希望使用已提供的 CCNetLabel 属性,则可以访问NAnt脚本中的标签。
希望这会有所帮助。如果您对评论有任何疑问,请告诉我。
答案 1 :(得分:1)
您是否尝试使用某些环境变量?我相信CCNet可以处理这些问题。
我会对此有所了解。
嗯,我看到了一个解决方案,很脏,但无论如何:
1-在CCNET项目定义中添加defaultlabeller部分。它将包含您要显示的内部版本号的模式。
2-在NAnt中,有一个脚本来更新您的配置文件,插入您想要查看的内部版本号。
3-触摸(在Unix意义上)ccnet.exe.config文件,以便重新加载项目配置文件。
etvoilà。
答案 2 :(得分:0)
我们也有这个问题。我最后写了一个特殊的CC标签插件。
答案 3 :(得分:0)
如果您的构建号码是连续的,您可以破解巡航控制状态文件,以便为其提供正确的构建号码。您正在寻找名为[projectName] .state。
的文件我将标签元素更改为正确的数字,将 LastSuccessfulIntegrationLabel 更改为新数字。
答案 4 :(得分:0)
然而,我们最近才得到 CruiseControl所以我们正式建造 数字不同于什么 在CruiseControl中列出。
按照gbanfill所说的排序,你可以告诉CC从哪个构建数开始,但是没有必要破解.ser文件。您可以使用JMX界面设置当前内部版本号,以使其与您的NAnt内部版本号同步。
您还可以将default label值设置为当前内部版本号,删除.ser文件并重新启动CC。
但也许最简单的方法是将构建号写入NAnt的属性文件中,然后使用property file label incrementer来读取该文件。 (一定要设置setPreBuildIncrementer =“true”)