Подтвердить что ты не робот

Как получить список изменений (или рабочих элементов), которые были проверены между сборками?

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

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

4b9b3361

Ответ 1

Я знаю, что этой теме пару лет, но я нашел ее, пытаясь сделать то же самое. Я работаю над этим уже пару дней и придумал решение, которое выполняет эту конкретную задачу. (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
      }
    }
  }
}

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

Ответ 2

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

Получить связанные сборки из сборки

Очередь команды Создать из другого и передать параметры

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

Обратите внимание, что если вы используете это из командной строки postwill script, вы можете использовать переменную 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));
        }
    }
}

Ответ 3

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

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

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

Ответ 4

Этот пост в блоге может быть тем, что вы ищете. Вы в основном просматриваете все найденные ссылки с Uri, содержащие "changeet". Для этого не существует определенного свойства.

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.
        }
    }
}

Ответ 5

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

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

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>

Ответ 6

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

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

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

Ответ 7

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

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