Как передать номер сборки из Нанта обратно в круиз-контроль

У меня есть сценарий сборки Nant, который CruiseControl использует для создания решения по запросу.

Однако мы получили CruiseControl совсем недавно, поэтому наш официальный номер сборки отличается от того, что указан в CruiseControl.

Я знаю, что CruiseControl внедряет некоторые свойства в сценарии сборки, чтобы я мог получить доступ к номеру сборки CC в сценарии (CCNetLabel), но как мне передать значение обратно в CC, чтобы использовать его в качестве номера сборки на экране пользовательского интерфейса?

Например, CC говорит сборку номер 2

Скрипт nAnt увеличивает значение buildnumber.xml при каждой сборке, а официальный номер сборки - 123.

Я хочу, чтобы пользовательский интерфейс CC отображал номер последней успешной сборки: 123, а не 2, так как мне передать это значение обратно?


person Matthew Rathbone    schedule 06.11.2008    source источник


Ответы (5)


Для этого требуется настраиваемый этикетировщик сборки. 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.

Надеюсь, это кому-то поможет. Дайте мне знать, если у вас возникнут какие-либо вопросы, разместив в комментариях.

person Scott Saad    schedule 06.11.2008
comment
Чтобы скомпилировать это, мне пришлось добавить ссылки на ThoughtWorks.CruiseControl.Core.dll и NetReflector.dll (оба в папке установки CruiseControl.Net, а затем добавить следующее для импорта пространств имен: с помощью Exortech.NetReflector; с помощью ThoughtWorks.CruiseControl.Core ; - person robaker; 14.07.2009
comment
Еще я хотел бы добавить, что вы убедитесь, что ваша сборочная dll называется ccnet. *. Plugin.dll, где * - любое имя, которое вы выбираете для своего подключаемого модуля. - person Ken; 05.01.2010

Вы пробовали использовать какие-то переменные среды? Я считаю, что CCNet с этим справится.

Я немного покопаюсь в этом.

Что ж, я вижу решение, довольно грязное, но все же:

1- Добавьте раздел defaultlabeller в определение вашего проекта CCNET. Он будет содержать образец номера сборки, который вы хотите отобразить.

2- В NAnt создайте сценарий для обновления файла конфигурации, вставив номер сборки, которую вы хотите увидеть.

3- Коснитесь (в смысле Unix) файла ccnet.exe.config, чтобы он перезагрузил файлы конфигурации проекта.

и вуаля.

person Vinzz    schedule 06.11.2008

У нас тоже была эта проблема. В итоге я написал специальный плагин для маркировки CC.

person JesperE    schedule 06.11.2008
comment
Нет, но это действительно не так уж и сложно. Наследуйте от net.sourceforge.cruisecontrol.LabelIncrementer, следуйте документации API, создайте свой плагин в банке, добавьте банку в свой CC config.xml. - person JesperE; 07.11.2008

Если ваши номера сборки являются последовательными, вы можете просто взломать файл состояния круиз-контроля, чтобы дать ему правильный номер сборки для начала. Вы ищете файл с именем [projectName] .state.

Я изменил элемент Label на правильный номер, а LastSuccessfulIntegrationLabel стал новым номером.

person gbanfill    schedule 07.01.2009

Однако мы получили CruiseControl совсем недавно, поэтому наш официальный номер сборки отличается от того, что указан в CruiseControl.

Примерно в соответствии с тем, что сказал gbanfill, вы можете указать CC, с каких номеров сборки начинать, но нет необходимости взламывать файл .ser. Вы можете использовать интерфейс JMX, чтобы установить текущий номер сборки, чтобы он синхронизировался с вашим номером сборки NAnt.

Вы также можете установить значение по умолчанию для текущего номера сборки, удалить файл .ser и перезапустите CC.

Но, возможно, проще всего записать номер сборки в файл свойств из NAnt, а затем использовать инкрементатор метки файла свойств, чтобы прочитать этот файл. (Обязательно установите setPreBuildIncrementer = "true")

person Jeffrey Fredrick    schedule 07.01.2009