为此需要自定义构建标签。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 项目文件以使用此贴标机。我们使用默认的 labeller 块来做到这一点。类似于以下内容:
<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 脚本中的标签。
希望这会有所帮助。如果您有任何问题,请通过评论告诉我。