Как получить список наборов изменений (или рабочих элементов), которые были зарегистрированы между сборками? - PullRequest
12 голосов
/ 15 января 2010

Мне нужен список наборов изменений (или рабочих элементов), которые были сделаны между сборками (я могу пометить сборки, если это необходимо). Мне нужен этот список для нашей команды по тестированию (и для публикации «списка изменений»).

Может ли задача MSBuild получить этот список и сохранить его в виде файла (тогда я смогу обработать этот список дальше.
Или, может быть, мне нужно подключиться к TFS из кода C # и получить этот список самостоятельно (я знаком с извлечением WorkItems в C #).

Ответы [ 7 ]

11 голосов
/ 27 января 2012

Я знаю, что этой теме уже пару лет, но я нашел ее, пытаясь выполнить то же самое. Я работаю над этим уже пару дней и придумала решение, которое решает эту конкретную задачу. (TFS 2010)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;
using Microsoft.TeamFoundation.Build.Client;


namespace BranchMergeHistoryTest
{
  class Program
  {
    private static Uri tfsUri = new Uri("http://sctf:8080/tfs");
    private static TfsTeamProjectCollection tfs = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(tfsUri);

    static void Main(string[] args)
    {

      IBuildServer buildServer = tfs.GetService<IBuildServer>();
      IBuildDefinition buildDef = buildServer.GetBuildDefinition("Project", "Specific Build");
      IOrderedEnumerable<IBuildDetail> builds = buildServer.QueryBuilds(buildDef).OrderByDescending(build => build.LastChangedOn);
      /* I had to use some logic to find the last two builds that had actual changesets attached - we have some builds that don't have attached changesets. You may want to do the same. */ 
      IBuildDetail newestBuild = builds.ElementAt(0); 
      IBuildDetail priorBuild = builds.ElementAt(1);

      string newestBuildChangesetId = newestBuild.Information.GetNodesByType("AssociatedChangeset")[0].Fields["ChangesetId"];
      string priorBuildChangesetId = priorBuild.Information.GetNodesByType("AssociatedChangeset")[0].Fields["ChangesetId"];

      VersionControlServer vcs = tfs.GetService<VersionControlServer>();
      const string sourceBranch = @"$SourceBranch-ProbablyHEAD";
      const string targetBranch = @"$TargetBranch-ProbablyRelease";
      VersionSpec versionFrom = VersionSpec.ParseSingleSpec(newestBuildChangesetId, null);
      VersionSpec versionTo = VersionSpec.ParseSingleSpec(priorBuildChangesetId, null);
      ChangesetMergeDetails results = vcs.QueryMergesWithDetails(sourceBranch, VersionSpec.Latest, 0, targetBranch,VersionSpec.Latest, 0, versionFrom, versionTo, RecursionType.Full);
      foreach(Changeset change in results.Changesets)
      {
        Changeset details = vcs.GetChangeset(change.ChangesetId);
        // extract info about the changeset
      }
    }
  }
}

Надеюсь, это поможет следующему человеку, пытающемуся выполнить задачу!

3 голосов
/ 07 июня 2014

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

Получение связанных наборов изменений из сборки

Поставить в очередь командную сборку из другого и передать параметры

Чего мне не хватало в большинстве статей, которые я нашел по этому вопросу, так это о том, как взять подробности сборки и загрузить соответствующие наборы изменений или рабочие элементы. Класс InformationNodeConverters был отсутствующим ключом для этого и позволяет вам получать и другие элементы. После этого я смог придумать следующий код, который довольно прост.

Обратите внимание, что если вы запускаете это из сценария PowerShell после сборки, вы можете использовать переменную TF_BUILD_BUILDURI. Я также включил код, который придумал, чтобы взять извлеченные сводные данные и загрузить фактический элемент.

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.TeamFoundation.Build.Client;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;
using Microsoft.TeamFoundation.WorkItemTracking.Client;

namespace Sample
{
    class BuildSample
    {
        public void LoadBuildAssociatedDetails(Uri tpcUri, Uri buildUri)
        {
            TfsTeamProjectCollection collection = new TfsTeamProjectCollection(tpcUri);
            IBuildServer buildServer = collection.GetService<IBuildServer>();
            IBuildDetail buildDetail = buildServer.GetAllBuildDetails(buildUri);

            List<IChangesetSummary> changeSets = InformationNodeConverters.GetAssociatedChangesets(buildDetail);
            VersionControlServer vcs = collection.GetService<VersionControlServer>();
            IEnumerable<Changeset> actualChangeSets = changeSets.Select(x => vcs.GetChangeset(x.ChangesetId));

            List<IWorkItemSummary> workItems = InformationNodeConverters.GetAssociatedWorkItems(buildDetail);
            WorkItemStore wis = collection.GetService<WorkItemStore>();
            IEnumerable<WorkItem> actualWorkItems = workItems.Select(x => wis.GetWorkItem(x.WorkItemId));
        }
    }
}
2 голосов
/ 16 января 2010

TFS автоматически создаст список всех наборов изменений и связанных рабочих элементов, зарегистрированных между двумя успешными сборками. Списки вы найдете в конце отчета о сборке.

Вы можете настроить сборку, которая будет использоваться для связи с тестировщиками. Когда эта сборка будет успешно собрана, тестировщики могут просто просмотреть отчет о сборке, чтобы увидеть, какие рабочие элементы и наборы изменений были зафиксированы с момента последней сборки.

Если вы настроили прослушиватель событий для свойства качества сборки, вы можете отправить по электронной почте оповещение тестировщикам о том, что при сборке качества подаются изменения для конкретной версии.

1 голос
/ 15 марта 2015

У нас есть метки сборки для каждой сборки, они совпадают с номером сборки, который совпадает с номером версии продукта, на котором работают наши QA и служба поддержки.

Итак, это работает для нас:

tf.exe history <BRANCH> /version:L<BUILD_NUMBER_FROM>~L<BUILD_NUMBER_TO> /recursive /collection:http://<our TFS server>

результаты выглядят так:

Changeset User              Date       Comment
--------- ----------------- ---------- -------------------------------------    ----------------
3722      Sergei Vorobiev   2013-11-16 Merge changeset 3721 from Main
3720      <redacted>
3719      <redacted>
1 голос
/ 26 июня 2010

Этот пост может быть тем, что вы ищете. Вы в основном просматриваете все ссылки, находя Uri, содержащий «changeset». Кажется, для этого нет особого свойства.

http://blogs.msdn.com/b/buckh/archive/2006/08/12/artifact-uri-to-changeset.aspx

(скопировано из блога на случай гниения)

using System;
using System.Collections.Generic;

using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.WorkItemTracking.Client;
using Microsoft.TeamFoundation;
using Microsoft.TeamFoundation.VersionControl.Client;

class ChangesetsFromWorkItems
{
    static void Main(string[] args)
    {
        if (args.Length < 2)
        {
            Console.Error.Write("Usage: ChangesetsFromWorkItems <server> <workitemid> [workitemid...]");
            Environment.Exit(1);
        }

        TeamFoundationServer server = TeamFoundationServerFactory.GetServer(args[0]);
        WorkItemStore wiStore = (WorkItemStore)server.GetService(typeof(WorkItemStore));
        VersionControlServer vcs = (VersionControlServer) server.GetService(typeof(VersionControlServer));

        int workItemId;
        for (int i = 1; i < args.Length; i++)
        {
            if (!int.TryParse(args[i], out workItemId))
            {
                Console.Error.WriteLine("ignoring unparseable argument {0}", args[i]);
                continue;
            }

            WorkItem workItem = wiStore.GetWorkItem(workItemId);
            List<Changeset> associatedChangesets = new List<Changeset>();
            foreach (Link link in workItem.Links)
            {
                ExternalLink extLink = link as ExternalLink;
                if (extLink != null)
                {
                    ArtifactId artifact = LinkingUtilities.DecodeUri(extLink.LinkedArtifactUri);
                    if (String.Equals(artifact.ArtifactType, "Changeset", StringComparison.Ordinal))
                    {
                        // Convert the artifact URI to Changeset object.
                        associatedChangesets.Add(vcs.ArtifactProvider.GetChangeset(new Uri(extLink.LinkedArtifactUri);
                    }
                }
            }

            // Do something with the changesets.  Changes property is an array, each Change
            // has an Item object, each Item object has a path, download method, etc.
        }
    }
}
0 голосов
/ 25 августа 2014

Я разместил статью в блоге о том, как это сделать, здесь: Получение списка изменений после указанной сборки / метки из TFS 2013 . Он обеспечивает быструю и лаконичную функцию для получения списка файлов, которые были изменены после данной сборки / метки.

Надеюсь, это поможет!

0 голосов
/ 15 января 2010

Мы делаем нечто подобное в нашем процессе сборки TFS. Чтобы сделать это, мы создали пользовательскую задачу MSBuild в C #, которая выполняет вызов TFS для элементов. Создавать пользовательские задачи довольно просто.

Вот статья, с которой можно начать писать задачи MSBuild. http://msdn.microsoft.com/en-us/library/t9883dzc.aspx

Полагаю, вы уже знаете, как выполнять вызовы в TFS на основании вашего вопроса.

...