TFS 2010 API - 获取合并的工作项

5
我需要在TFS 2010构建完成后发送一封电子邮件,其中详细说明了已编译为此构建的提交所关联的工作项。借助于构建工作流中提供的associatedChangesets变量,这很容易实现。
然而,在生产环境中,我们将从开发分支合并更改到发布分支。此时,构建程序认为只有一个更改 - 即将Development合并到Release中。显然,这相当无用,因为我们需要找出在合并的分支中进行了哪些更改以及相关的工作项
有没有人知道如何使用TFS 2010 API来完成这个任务?从API角度来看,它似乎文档非常不完善。我知道你可以在VS2010中扩展合并历史节点,但很明显,这样做是不够好的,因为这些数据需要通过编程的方式收集,以便发送报告邮件。

这是不是一个重复/子集问题:https://dev59.com/9msz5IYBdhLWcg3w9s2r - pantelif
1个回答

7

好的...我认为我找到了一个解决方案,虽然它有些笨重,说实话我也不确定它是如何工作的。但是,在这里我分享一下——也许会指引某个人朝着正确的方向前进。

var associatedWorkItems = new List<WorkItem>();

//Passed in from the build workflow (this variable is available under the 'Run On Agent' sequence as 'associatedChangesets'
IList<Changeset> associatedChangesets = context.GetValue(BuildAssociatedChangesets);

if (associatedChangesets.Count > 0)
{
    var projectCollection =
        new TfsTeamProjectCollection(new Uri("http://localhost:8080/tfs/DefaultCollection"));
    VersionControlServer versionControlServer = projectCollection.GetService<VersionControlServer>();

    foreach (var changeset in associatedChangesets)
    {
        //In order to view the individual changes, load the changeset directly from the VCS.
        Changeset localChangeset = versionControlServer.GetChangeset(changeset.ChangesetId);

        foreach (Change change in localChangeset.Changes)
        {
            //Find out what was merged in.
            ChangesetMerge[] mergedChangesets = versionControlServer.QueryMerges(
                null,
                null,
                change.Item.ServerItem,
                new ChangesetVersionSpec(localChangeset.ChangesetId),
                new ChangesetVersionSpec(localChangeset.ChangesetId),
                null,
                RecursionType.Full);

            //Extract work item information from changesets being identified as merged.
            foreach (var changesetMerge in mergedChangesets)
            {
                Changeset actualChange = versionControlServer.GetChangeset(changesetMerge.SourceVersion);

                foreach (WorkItem item in actualChange.WorkItems)
                {
                    if (!associatedWorkItems.Exists(w => w.Id == item.Id))
                    {
                        associatedWorkItems.Add(item);
                    }
                }
            }
        }
    }
}

不要问我QueryMerges的具体工作方式,但这里我所做的就是告诉它显示作为变更集合一部分合并的内容。您会注意到参数ChangesetVersionSpec是相同的 - 这意味着我们只查看来自此一个变更集的合并。
您将从QueryMerges()获得一个ChangesetMerge对象数组。在ChangesetMerge类中有一个叫做SourceVersion的属性 - 这是合并的原始变更集的ChangesetId。一旦我们获得了这个,我们就可以使用VersionControlServer.GetChangeset()方法加载单个集并提取WorkItem。然后将其添加到WorkItems列表中,可以按任何想要的方式进行操作(在我的情况下是电子邮件)。我还使用了.Exists()检查以确保不会重复记录相同的WorkItem
请注意,即使您拥有构建工作流程中的associatedChangesets集合,由于某种原因(至少对我而言),associatedChangesets内部的Changes[]属性从未填充过(因此使用VersionControlServer.GetChangeset()方法加载每个单独的变更集,因为这似乎实际上填充了我们需要的所有字段。
就像我说的那样,1. 这是一个笨拙的解决方案(很多循环 - 其中一些可能是不必要的),2. 我并不完全理解它是如何工作的,尽管它似乎产生了所需的结果 - 我通过进行大量测试和调试得出了这个结论),最后 - 这是我根据微软提供的糟糕文档想出的最好方法。
希望对某人有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接