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