更新了许多TFS项目的构建定义(Updating the build definition for

2019-10-18 05:31发布

我们正在升级TFS农场到TFS 2012年。这样做,我们已经设置了使用TFS安装升级路径中的新构建服务器。 但是我们的新生成控制器的名称为TFS2012Build,而旧的已经TFSBuild。

现在我有很多数百个具有无效生成控制器生成定义。 有没有一种方法可以自动或通过脚本来更新生成控制器?

Answer 1:

我不知道有什么“自动”的方法来做到这一点。 这是很容易获得通过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

祝好运。



Answer 2:

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;
        }
    }


}


文章来源: Updating the build definition for many TFS projects