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

但是,我们直到最近才获得CruiseControl,因此我们的正式内部版本号与CruiseControl中列出的版本号不同。

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

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

nAnt脚本在每个版本中都增加一个buildnumber.xml值,并且官方版本号在123上。

我想让CC UI显示上次成功的内部版本号:123,而不是2,那么如何将该值传递回去?

最佳答案

为此,需要自定义构建标签。 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脚本中的标签。

希望这会有所帮助。张贴到评论中,让我知道您是否有任何疑问。

关于version-control - 如何将内部编号从Nant传递回Cruise Control,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/268289/

10-13 07:48