TFS: запрос сборок, содержащих определенный набор изменений

У меня есть несколько определений сборки, которые выполняются на основе одной ветки в TFS (например, Main).

Я хотел бы (каким-то образом) запросить TFS, чтобы найти все сборки, содержащие определенный номер набора изменений, который я предоставляю, и вернуть список строк имен сборок, содержащихся в TFS. Подойдет любое приложение (расширение VS, приложение CLI, winforms и т. д.).

Примечание: это не запрос «пожалуйста, дайте мне код»; Я готов взяться за дело и серьезно поработать над этим. Любые указатели на документацию о том, как запрашивать базу данных или SDK, или пример того, как запрашивать сборки; просто какое-то место для начала поиска было бы чрезвычайно полезно. Спасибо.


person J. Polfer    schedule 04.04.2012    source источник


Ответы (2)


Следующий фрагмент кода просканирует все определения сборок всех командных проектов коллекции и проверит каждую сборку на наличие связи с введенным номером набора изменений:

using System;
using System.Linq;
using Microsoft.TeamFoundation.Build.Client;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;

namespace FindChangesetInBuild
{
    class Program
    {
        static void Main(string[] args)
        {
            TfsTeamProjectCollection teamProjectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("http://tfs:8080/tfs/collectionName"));

            var versionControl = teamProjectCollection.GetService<VersionControlServer>();
            var buildService = (IBuildServer)teamProjectCollection.GetService(typeof(IBuildServer));

            var teamProjects = versionControl.GetAllTeamProjects(true);
            foreach (var teamProject in teamProjects)
            {
                var buildDefinitions = buildService.QueryBuildDefinitions(teamProject.Name);
                foreach (var buildDefinition in buildDefinitions)
                {
                    var builds = buildService.QueryBuilds(buildDefinition);
                    foreach (var buildDetail in builds)
                    {
                        var changesets = InformationNodeConverters.GetAssociatedChangesets(buildDetail);
                        if (changesets.Any(changesetSummary => changesetSummary.ChangesetId == Convert.ToInt32(args[0])))
                        {
                            Console.WriteLine("Changeset was build in "+buildDetail.BuildNumber);
                        }
                    }
                }
            }
        }
    }
}

Излишне говорить, что это атака полным перебором.
Вы можете дополнительно улучшить код, если сузите список buildDefinition, сосредоточитесь на конкретных teamProjects и т. д. В любом случае я вряд ли могу представить вышеизложенное полезным, поскольку- есть!

Помимо (очевидно) MSDN, отличным ресурсом для TFS-SDK является блог.
Для примеров, специфичных для сборки, см. также здесь & здесь для некоторых, возможно, интересных сообщений SO.

person pantelif    schedule 05.04.2012
comment
Спасибо! Я бы хотел, чтобы при запросе было доступно больше параметров фильтрации; у нас есть ряд сборок, для которых мы сохраняем информацию, и для возврата запросов требуется очень много времени. Буду экспериментировать и смотреть. - person J. Polfer; 05.04.2012

Вы можете использовать этот небольшой запрос к БД в TFS 2010 и просто заменить 90264 идентификатором вашего набора изменений.

USE Tfs_Warehouse
go
SELECT BuildName 
FROM DimBuild
   INNER JOIN FactBuildChangeset
   ON DimBuild.BuildSK = FactBuildChangeset.BuildSK
WHERE FactBuildChangeset.ChangesetSK = 90264
person Stu    schedule 07.02.2013