我們正在將我們的TFS服務器場升級到TFS 2012.爲此,我們使用TFS安裝程序中的升級路徑設置了一個新的構建服務器。然而,我們的新構建控制器的名稱是TFS2012Build,而舊構建控制器是TFSBuild。更新許多TFS項目的構建定義
現在我有成百上千的構建定義具有無效的構建控制器。有沒有辦法自動或通過腳本更新生成控制器?
我們正在將我們的TFS服務器場升級到TFS 2012.爲此,我們使用TFS安裝程序中的升級路徑設置了一個新的構建服務器。然而,我們的新構建控制器的名稱是TFS2012Build,而舊構建控制器是TFSBuild。更新許多TFS項目的構建定義
現在我有成百上千的構建定義具有無效的構建控制器。有沒有辦法自動或通過腳本更新生成控制器?
我不知道任何「自動」方法來做到這一點。很容易通過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-agents-using-the-api.aspx
祝你好運。
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;
}
}
}
感謝您的資源清單。他們最終幫助我們瀏覽了TFS API的未知領域。 –