Как передать номер сборки от Nant обратно в круиз-контроль - PullRequest
6 голосов
/ 06 ноября 2008

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

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

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

Пример, CC говорит, что сборка № 2

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

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

Ответы [ 5 ]

7 голосов
/ 06 ноября 2008

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

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

1 голос
/ 06 ноября 2008

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

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

Ну, я вижу решение, довольно грязное, но в любом случае:

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

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

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

et voilà.

0 голосов
/ 07 января 2009

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

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

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

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

0 голосов
/ 07 января 2009

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

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

0 голосов
/ 06 ноября 2008

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

...