我们正在升级TFS农场到TFS 2012年。这样做,我们已经设置了使用TFS安装升级路径中的新构建服务器。 但是我们的新生成控制器的名称为TFS2012Build,而旧的已经TFSBuild。
现在我有很多数百个具有无效生成控制器生成定义。 有没有一种方法可以自动或通过脚本来更新生成控制器?
我们正在升级TFS农场到TFS 2012年。这样做,我们已经设置了使用TFS安装升级路径中的新构建服务器。 但是我们的新生成控制器的名称为TFS2012Build,而旧的已经TFSBuild。
现在我有很多数百个具有无效生成控制器生成定义。 有没有一种方法可以自动或通过脚本来更新生成控制器?
我不知道有什么“自动”的方法来做到这一点。 这是很容易获得通过API构建的定义,以及BuildController可用。
在没有像样的TFS API文档,还有很多有可使用的API的例子。 一个简单的谷歌搜索,就会发现这些。
一些建议,以帮助启动您的努力: http://msdn.microsoft.com/en-us/library/microsoft.teamfoundation.build.client.ibuilddefinition.aspx
一个很好的示例应用程序是在这里: http://blogs.microsoft.co.il/blogs/shair/archive/2011/01/11/tfs-api-part-33-get-build-definitions-and-build-details的.aspx
最后,有良好的代码在这里,编辑构建定义,可能是你一个更好的起点: http://geekswithblogs.net/jakob/archive/2009/12/08/tfs-2010-ndash-managing-build-代理-使用最api.aspx
祝好运。
JamieMeyer有正确的想法。 有没有在MSDN多好TFS文件,但也有很多优秀的博客资源。 下面是我创建这样做在一个非常有教育意义的周末的过程中,脚本的轻微模糊版本。 我们更新了手工一个项目的构建控制器,然后以编程更新所有依赖于构建的名称等项目。 把它像BuildControllerChangeUtil http://tfsserver:8080/tfs/defaultcollection ProjectName
,其中项目名称是一个项目,其构建已经更新了构建服务器。
using Microsoft.TeamFoundation.Build.Client;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.WorkItemTracking.Client;
using System;
using System.Collections.Generic;
using System.Linq;
namespace BuildControllerChangeUtil
{
class Program
{
static void Main(string[] args)
{
string tfsDefaultcollection = args[0];
string knownGoodProject = args[1];
var tfs = new TfsTeamProjectCollection(new Uri(tfsDefaultcollection));
var buildServer = tfs.GetService<IBuildServer>();
var knownGoodDefs = buildServer.QueryBuildDefinitions(knownGoodProject);
var testController = knownGoodDefs.First(bd => bd.Name.Equals("Test")).BuildController ;
var releaseController = knownGoodDefs.First(bd => bd.Name.Equals("Release")).BuildController ;
foreach (var teamProject in GetTfsProjects( tfsDefaultcollection ))
{
var buildDetails = buildServer.QueryBuildDefinitions(teamProject);
if (!buildDetails.Any())
{
Console.WriteLine("{0} has no build defintions. ", teamProject);
}
foreach (var thisBuild in buildDetails)
{
if (thisBuild.Name.ToUpperInvariant().Contains("TEST"))
{
SetBuildController(teamProject, thisBuild, testController);
}
else if (thisBuild.Name.ToUpperInvariant().Contains("PRODUCTION"))
{
SetBuildController(teamProject, thisBuild, releaseController);
}
else
{
Console.Error.WriteLine( "Team project {0} had an unknown build name {1}",teamProject , thisBuild.Name);
}
}
}
}
private static void SetBuildController(string teamProject, IBuildDefinition thisBuild, IBuildController bc)
{
Console.WriteLine("setting {0} build {1} build controller to {2}", teamProject , thisBuild.Name, bc.Name );
thisBuild.BuildController = bc;
thisBuild.Save();
}
private static IEnumerable<string> GetTfsProjects(string tfsAddress)
{
var tpcAddress = new Uri(tfsAddress);
var tpc = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(tpcAddress);
tpc.Authenticate();
var workItemStore = new WorkItemStore(tpc);
var projectList = (from Project pr in workItemStore.Projects select pr.Name).ToList();
return projectList;
}
}
}