如何将建筑物编号从Nant传递回Cruise Control

时间:2008-11-06 11:00:58

标签: version-control build-process cruisecontrol.net nant

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

但是,我们最近才获得CruiseControl,因此我们的官方版本号与CruiseControl中列出的版本号不同。

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

示例,CC表示内部版本号2

nAnt脚本在每次构建时增加buildnumber.xml值,官方内部版本号在123上。

我希望CC UI显示最后一个成功的内部版本号:123,而不是2,所以我该如何传递该值?

5 个答案:

答案 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”)