TFS API - Как запрашивать сборки независимо от того, к какому определению сборки они принадлежат - PullRequest
19 голосов
/ 10 марта 2011

Кажется, никакие перегрузки IBuildServer.QueryBuilds(...) не позволяют мне сделать это.

Вот мой код:

TfsTeamProjectCollection tfs = context.GetValue(TeamProject);
IBuildServer buildServer = (IBuildServer)tfs.GetService(typeof(IBuildServer));
buildServer.QueryBuilds( // **what should i put here?**

Я не хочу указывать определение сборки, потому что желаемая сборка может быть любого типа.

Этот вопрос кажется легким, но поиск в Google не дал мне ответов.

Ответы [ 2 ]

46 голосов
/ 11 марта 2011

Этот код получит все сборки.,,ever

TfsTeamProjectCollection tfs = new TfsTeamProjectCollection(new Uri("http://tfs:8080"));

var vcs = tfs.GetService<VersionControlServer>();

var teamProjects = vcs.GetAllTeamProjects(true);

IBuildServer buildServer = (IBuildServer)tfs.GetService(typeof(IBuildServer));

foreach (TeamProject proj in teamProjects)
{
    var builds = buildServer.QueryBuilds(proj.Name);

    foreach (IBuildDetail build in builds)
    {
        var result = string.Format("Build {0}/{3} {4} - current status {1} - as of {2}",
        build.BuildDefinition.Name,
        build.Status.ToString(),
        build.FinishTime,
        build.LabelName,
        Environment.NewLine);

        System.Console.WriteLine(result);
    }            
}

Тем не менее, вас, вероятно, больше интересует этот код, который перечисляет каждый командный проект и получает последний статус сборки для каждого из определений:

TfsTeamProjectCollection tfs = new TfsTeamProjectCollection(new Uri("http://tfs:8080"));

var vcs = tfs.GetService<VersionControlServer>();

var teamProjects = vcs.GetAllTeamProjects(true);

IBuildServer buildServer = (IBuildServer)tfs.GetService(typeof(IBuildServer));

foreach (TeamProject proj in teamProjects)
{
    var defs = buildServer.QueryBuildDefinitions(proj.Name);

    System.Console.WriteLine(string.Format("Team Project: {0}", proj.Name));

    foreach(IBuildDefinition def in defs)
    {
        IBuildDetailSpec spec = buildServer.CreateBuildDetailSpec(proj.Name, def.Name);
        spec.MaxBuildsPerDefinition = 1;
        spec.QueryOrder = BuildQueryOrder.FinishTimeDescending;

        var builds = buildServer.QueryBuilds(spec);

        if (builds.Builds.Length > 0)
        {
            var buildDetail = builds.Builds[0];

            System.Console.WriteLine(string.Format("   {0} - {1} - {2}", def.Name, buildDetail.Status.ToString(), buildDetail.FinishTime));
        }                
    }

    System.Console.WriteLine();
}
8 голосов
/ 02 августа 2013

Вы можете использовать следующий подход (вдохновленный статьей http://www.incyclesoftware.com/2012/09/fastest-way-to-get-list-of-builds-using-ibuildserver-querybuilds-2/):

Выгода - намного более быстрый отклик (по моим собственным тестам - примерно в 50 раз быстрее!)

//Connect to TFS build server
string serverName = "http://myserver:8080/tfs/my_collection";
Uri tfsUri = new Uri(serverName);
TeamFoundationServer tfsServer = TeamFoundationServerFactory.GetServer(serverName);
IBuildServer buildServer = (IBuildServer)tfsServer.GetService(typeof(IBuildServer));
ILinking iLinkingService = tfsServer.GetService<ILinking>(); //can be used later to get build URL link


//Specify query
IBuildDetailSpec spec = buildServer.CreateBuildDetailSpec("*");
spec.InformationTypes = null; // for speed improvement
spec.MinFinishTime = DateTime.Now.AddDays(-21); //to get only builds of last 3 weeks
spec.MaxBuildsPerDefinition = 1; //get only one build per build definintion
spec.QueryOrder = BuildQueryOrder.FinishTimeDescending; //get the latest build only
spec.QueryOptions = QueryOptions.All;

var builds = buildServer.QueryBuilds(spec).Builds;
...