我该如何将Nant的构建编号传回Cruise Control?

6

我有一个Nant构建脚本,CruiseControl使用它来按需构建解决方案。

然而,我们最近才得到CruiseControl,因此我们的官方构建编号与CruiseControl中列出的不同。

我知道CruiseControl向构建脚本注入一些属性,以便我可以在脚本中访问CC构建编号(CCNetLabel),但是如何将一个值传回CC以用作UI屏幕上的构建编号呢?

例如,CC显示构建编号2

nAnt脚本每次构建都会递增buildnumber.xml的值,官方构建编号为123。

我希望CC UI显示上次成功的构建编号:123,而不是2,那么我该如何将该值传回去呢?

5个回答

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项目文件以利用此标签器。我们使用默认标签器块进行了此操作。类似以下内容:
<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中,那么你已经完成了,不需要做其他任何事情。然而,如果你希望在NAnt脚本中访问标签,可以使用已提供的CCNetLabel属性。

希望这能帮到你。如果你有任何问题,请在评论区留言告诉我。


1
为了编译这个,我不得不添加对ThoughtWorks.CruiseControl.Core.dll和NetReflector.dll的引用(两者都在CruiseControl.Net安装文件夹中),然后添加以下内容以导入命名空间:using Exortech.NetReflector; using ThoughtWorks.CruiseControl.Core; - robaker
我想要补充的是,请确保你的程序集 DLL 的名称为“ccnet.*.plugin.dll”,其中 * 是你选择的插件名称。 - Ken

1

你尝试使用一些环境变量了吗?我相信CCNet可以处理这些。

我会再深入研究一下。

好的,我看到一个解决方案,相当不干净,但无论如何:

1- 在CCNET项目定义中添加defaultlabeller部分。它将包含您想要显示的构建号的模式。

2- 在NAnt中,有一个脚本来更新您的配置文件,插入您想要查看的构建号。

3- 触摸(在Unix意义上)ccnet.exe.config文件,以使其重新加载项目配置文件。

et voilà。


0
如果你的构建编号是连续的,你可以修改巡航控制状态文件以给它正确的起始构建号。你需要找到一个叫做 [projectName].state 的文件。
我将 Label 元素改为了正确的数字,并将 LastSuccessfulIntegrationLabel 改为了新的数字。

0
然而,我们最近才得到了CruiseControl,因此我们的官方构建编号与CruiseControl中列出的不同。类似于gbanfill所说的那样,您可以告诉CC从哪个构建号开始,但没有必要破解.ser文件。您可以使用JMX接口将当前构建号设置为与NAnt构建号同步。您还可以将默认标签值设置为当前构建号,删除.ser文件并重新启动CC。但也许最简单的方法是从NAnt将构建号写入属性文件,然后使用属性文件标签增量器读取该文件。(请确保设置setPreBuildIncrementer="true")

0
我们也遇到了这个问题。最终我写了一个特殊的CC标签插件。

不,但这并不是很难。继承自net.sourceforge.cruisecontrol.LabelIncrementer,遵循API文档,将您的插件构建为jar文件,将该jar文件添加到您的CC config.xml中。 - JesperE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接