6

CruiseControl がオンデマンドでソリューションを構築するために使用する Nant ビルド スクリプトがあります。

ただし、CruiseControl は最近入手したばかりなので、公式のビルド番号は CruiseControl に記載されているものとは異なります。

CruiseControl がビルド スクリプトにいくつかのプロパティを挿入して、スクリプト (CCNetLabel) 内の CC ビルド番号にアクセスできることは知っていますが、UI 画面でビルド番号として使用する値を CC に戻すにはどうすればよいですか?

例、CC はビルド番号 2 を示します

nAnt スクリプトは、ビルドごとに buildnumber.xml 値をインクリメントします。公式のビルド番号は 123 です。

CC UI に最後に成功したビルド番号: 2 ではなく 123 を表示したいのですが、その値を戻すにはどうすればよいですか?

4

5 に答える 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 に表示するだけの場合は、これで完了です。他に何もする必要はありません。ただし、必要に応じて、すでに提供されているCCNetLabelプロパティを使用して、NAnt スクリプトでラベルにアクセスできます。

これが役立つことを願っています。ご不明な点がございましたら、コメントに投稿してお知らせください。

于 2008-11-06T16:00:52.590 に答える
1

いくつかの環境変数を使用しようとしましたか? CCNetなら対応できると思います。

これについて少し掘り下げます。

まあ、私は解決策を見て、かなり汚れていますが、とにかく:

1- CCNET プロジェクト定義に defaultlabeller セクションを追加します表示したいビルド番号のパターンが含まれます。

2- NAnt 内に、構成ファイルを更新するスクリプトを用意し、表示したいビルド番号を挿入します。

3- (Unix の意味で) ccnet.exe.config ファイルをタッチして、プロジェクト構成ファイルを再ロードします。

ほら。

于 2008-11-06T11:11:53.843 に答える
0

この問題もありました。結局、特別なCCラベリングプラグインを作成しました。

于 2008-11-06T13:21:22.007 に答える
0

ただし、CruiseControl は最近入手したばかりなので、公式のビルド番号は CruiseControl に記載されているものとは異なります。

gbanfill が言ったことに沿って、どのビルド番号から開始するかを CC に伝えることができますが、.ser ファイルをハックする必要はありません。JMX インターフェイスを使用して現在のビルド番号を設定し、NAnt ビルド番号と同期させることができます。

デフォルトのラベル値を現在のビルド番号に設定し、.ser ファイルを削除して CC を再起動することもできます。

しかし、おそらく最も簡単な方法は、ビルド番号を NAnt からプロパティ ファイルに書き込み、プロパティ ファイル ラベル インクリメンタを使用してそのファイルを読み取ることです。(必ず setPreBuildIncrementer="true" を設定してください)

于 2009-01-07T16:32:24.493 に答える