2008-11-06 30 views
6

我有一個Nant構建腳本,CruiseControl用它來構建按需解決方案。如何將內部編號從南特傳回巡航控制

但是,我們最近纔得到CruiseControl,因此我們的官方版本號與CruiseControl中列出的不同。

我知道CruiseControl將一些屬性注入到構建腳本中,以便我可以訪問腳本(CCNetLabel)中的CC構建號,但是如何將值傳遞迴CC以用作UI屏幕上的內部版本號?

例,CC說,建號2

楠腳本遞增buildnumber.xml值每次構建,而官方版本號是123

我希望CC UI顯示上次成功集結號:123,而不是2,那麼我怎麼把這個值傳回去呢?

回答

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

你是否嘗試過使用一些環境變量?我相信CCNet可以處理這些問題。

我會在這方面挖一點。

嗯,我看到一個解決方案,非常髒,但無論如何:

1-添加defaultlabeller部分在你的CCNET項目定義。它將包含要顯示的內部版本號的模式。

2-在NAnt中,有一個腳本來更新您的配置文件,插入您想要查看的內部版本號。

3-觸摸(在Unix意義上)ccnet.exe.config文件,以便重新加載項目配置文件。

etvoilà。

0

我們也有這個問題。我最終寫了一個特殊的CC標籤插件。

+0

您沒有要分發的代碼嗎? – 2008-11-06 13:25:52

+0

不,但它並不那麼困難。從net.sourceforge.cruisecontrol.LabelIncrementer繼承,遵循API文檔,將您的插件構建到jar中,然後將jar添加到CC config.xml。 – JesperE 2008-11-07 11:42:47

0

如果您的內部版本號是連續的,那麼您可以對巡航控制狀態文件進行破解,爲其提供正確的內部版本號。您正在尋找名爲[projectName] .state的文件。

我改變了標籤元素正確的號碼和LastSuccessfulIntegrationLabel成爲新的號碼。

0

然而,我們最近纔得到CruiseControl的 所以我們正式構建 號是從什麼 在CruiseControl的上市不同。

根據gbanfill的說法,你可以告訴CC什麼構建號碼從頭開始,但沒有必要破解.ser文件。您可以使用JMX界面設置當前內部版本號以使其與您的NAnt內部版本號保持同步。

您還可以將default label值設置爲您當前的內部版本號,刪除.ser文件並重新啓動CC。

但也許最簡單的事情是將內部編號寫入NAnt的屬性文件中,然後使用property file label incrementer來讀取該文件。 (請務必設置setPreBuildIncrementer =「true」)