Build 更新许多TFS项目的生成定义

Build 更新许多TFS项目的生成定义,build,tfs,Build,Tfs,我们正在将TFS场升级到TFS 2012。在这样做的过程中,我们使用TFS设置中的升级路径设置了一个新的构建服务器。然而,我们的新构建控制器名为TFS2012Build,而旧的控制器名为TFSBuild 现在,我有数百个生成定义,其中包含无效的生成控制器。有没有办法自动或通过脚本更新生成控制器 我不知道有什么“自动”的方法可以做到这一点。通过API很容易获得构建定义,并且可以使用BuildController 在缺乏像样的TFSAPI文档的情况下,有许多示例可以使用该API。一个简单的谷歌搜索就

我们正在将TFS场升级到TFS 2012。在这样做的过程中,我们使用TFS设置中的升级路径设置了一个新的构建服务器。然而,我们的新构建控制器名为TFS2012Build,而旧的控制器名为TFSBuild

现在,我有数百个生成定义,其中包含无效的生成控制器。有没有办法自动或通过脚本更新生成控制器

我不知道有什么“自动”的方法可以做到这一点。通过API很容易获得构建定义,并且可以使用BuildController

在缺乏像样的TFSAPI文档的情况下,有许多示例可以使用该API。一个简单的谷歌搜索就会发现这些

以下几点建议有助于启动您的工作:

下面是一个很好的示例应用程序:

最后,这里有很好的代码可以编辑生成定义,这可能是一个更好的起点:


祝你好运。

JamieMeyer的想法是对的。MSDN中没有太多好的TFS文档,但是有很多好的博客资源。这是我在一个非常有教育意义的周末创建的脚本的一个稍微模糊的版本。我们手动更新了一个项目的构建控制器,然后根据构建的名称以编程方式更新了所有其他项目。像
BuildControllerChangeUtil那样调用它http://tfsserver:8080/tfs/defaultcollection ProjectName
其中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;
        }
    }


}
使用Microsoft.TeamFoundation.Build.Client;
使用Microsoft.TeamFoundation.Client;
使用Microsoft.TeamFoundation.WorkItemTracking.Client;
使用制度;
使用System.Collections.Generic;
使用System.Linq;
命名空间BuildControllerChangeUtil
{
班级计划
{
静态void Main(字符串[]参数)
{
字符串tfsDefaultcollection=args[0];
字符串knownGoodProject=args[1];
var tfs=new-tfstreamprojectcollection(新Uri(tfsDefaultcollection));
var buildServer=tfs.GetService();
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(GetTfsProjects(tfsDefaultcollection)中的var teamProject)
{
var buildDetails=buildServer.QueryBuildDefinitions(teamProject);
如果(!buildDetails.Any())
{
WriteLine(“{0}没有生成定义。”,teamProject);
}
foreach(var thisBuild in buildDetails)
{ 
if(thisBuild.Name.ToUpperInvariant()包含(“测试”))
{
SetBuildController(teamProject、thisBuild、testController);
}  
else if(thisBuild.Name.ToUpperInvariant().Contains(“PRODUCTION”))
{
SetBuildController(teamProject、thisBuild、releaseController);
}  
其他的
{
WriteLine(“团队项目{0}具有未知的生成名{1}”,团队项目,thisBuild.name);
}
} 
}
}
私有静态void SetBuildController(字符串teamProject、IBuildDefinition thisBuild、IBuildController bc)
{
WriteLine(“将{0}构建{1}构建控制器设置为{2}”,teamProject,thisBuild.Name,bc.Name);
thisBuild.BuildController=bc;
thisBuild.Save();
}
私有静态IEnumerable GetTfsProjects(字符串tfsAddress)
{
var tpcadress=新Uri(tfsAddress);
var tpc=tfstreamprojectcollectionfactory.GetTeamProjectCollection(tpcadress);
tpc.Authenticate();
var workItemStore=新的workItemStore(tpc);
var projectList=(从workItemStore.Projects中的项目pr选择pr.Name.ToList();
返回项目列表;
}
}
}

感谢您提供的大量资源。他们最终帮助我们在TFS API的未知水域航行。