12

ビルド間で作成された変更セット (または作業項目) のリストが必要です (必要に応じてビルドにラベルを付けることができます)。私たちのテスト チーム (および「変更リスト」を公開する) のためにそのリストが必要です。

MSBuild タスクはそのリストを取得してファイルとして保存できますか (その後、そのリストをさらに処理できます。
または、C# コードから TFS に接続して、そのリストを自分で取得する必要があるかもしれません (C# で WorkItems を取得することに慣れています)。

4

7 に答える 7

11

このスレッドが数年前のものであることは知っていますが、同じことを達成しようとしたときに見つけました。私はこれに数日間取り組んでおり、この特定のタスクを達成するソリューションを思い付きました。(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
      }
    }
  }
}

これが、タスクを達成しようとする次の人に役立つことを願っています!

于 2012-01-27T01:03:53.400 に答える
3

これが古い投稿であることは承知していますが、これを達成する方法を何時間も探し回っています。私は 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));
        }
    }
}
于 2014-06-07T18:37:37.780 に答える
2

TFS は、成功した 2 つのビルドの間にチェックインされたすべての変更セットと関連する作業項目のリストを自動的に作成します。リストはビルド レポートの最後にあります。

テスターとの通信に使用されるビルドをセットアップできます。そのビルドが正常にビルドされると、テスターはビルド レポートを見て、最後のビルド以降にコミットされた作業項目と変更セットを確認できます。

ビルドのビルド品質プロパティのイベント リスナーを設定すると、ビルド品質が特定のバージョンに変更されたときに、テスターに​​電子メール アラートを送信できます。

于 2010-01-16T16:49:17.987 に答える
1

このブログ投稿は、あなたが探しているものかもしれません。基本的に、すべてのリンクを調べて、「changeset」を含む Uri を持つリンクを見つけます。これには特定のプロパティはないようです。

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.
        }
    }
}
于 2010-06-26T17:23:06.427 に答える
1

各ビルドにはビルド ラベルがあり、ビルド番号と同じです。ビルド番号は、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>
于 2015-03-15T04:01:27.233 に答える
0

TFS ビルド プロセスでも同様のことを行います。これを行うために、アイテムの TFS を呼び出す MSBuild カスタム タスクを C# で作成しました。カスタム タスクを作成するのは非常に簡単です。

これは、MSBuild タスクの作成を開始するための記事です。 http://msdn.microsoft.com/en-us/library/t9883dzc.aspx

あなたの質問に基づいて、TFS への呼び出しを行う方法を既に知っていると思います。

于 2010-01-15T00:01:23.260 に答える
0

これを行う方法に関するブログ記事をここに投稿しました: TFS 2013 から指定されたビルド/ラベルの後に変更のリストを取得する。特定のビルド/ラベル以降に変更されたファイルのリストを取得するための迅速かつ簡潔な機能を提供します。

それが役立つことを願っています!

于 2014-08-25T16:21:59.767 に答える