首页 > 解决方案 > 自动更新 TFS 构建定义

问题描述

我们正在从 TFS2010 迁移到 TFS2015 update3。我们想用新的 TFS2015 XAML 控制器和代理名称更新所有现有的 TFS2010 XAML 构建定义。是否有一种自动化的方式可以完成,因为它需要在所有现有的构建定义上完成。

标签: tfs

解决方案


您可以尝试使用 TFS API 来更新 XAML 构建定义:

下面的示例供您参考:(有关详细信息,请参考此线程:更新许多 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;
        }
    }


}

推荐阅读