gpt4 book ai didi

TFS2010 - SourceGetVersion 中出现错误的变更集

转载 作者:行者123 更新时间:2023-12-02 23:36:00 25 4
gpt4 key购买 nike

我目前正在设置 Team Foundation Server 2010,在执行构建时我发现了一个非常奇怪的行为:

情况说明:我们有 2 家分行

  • 开发
  • 主要

所有开发人员仅将代码 checkin 开发分支。构建经理每天一次将一些变更集合并到主分支。在开发分支上,每次 checkin 时都会运行连续构建。在主分支上,每天(晚上)触发一次构建。

现在假设变更集 1-100 在下午 5 点被合并到主分支中,将变更集 101 作为合并操作。一些开发人员在 5 点后将变更集 102-106 checkin 开发分支。现在晚上 11 点,每日构建会自动触发并在主分支上运行。 Main 分支的最后一个变更集是变更集 101。但是,构建详细信息显示变更集 106:

enter image description here

我可以想象这种行为是有意为之的,因为如果您在主分支上查看变更集 106,您实际上将获得变更集 101 的内容。但是如果此构建摘要显示正确的数字,那么它的可读性会更高.

问题1:有没有办法操作SourceGetVersion信息的输出?也许通过构建过程模板?

第二种情况,TFS 表现奇怪,情况更糟:排队新构建时,可以选择输入“获取版本”参数,如下图所示:

enter image description here

如果我现在单击“队列”,则会触发构建,并且构建详细信息再次输出变更集 106,尽管我专门将其设置为获取变更集 76。

问题 2:这是一个错误吗?有修补程序或其他东西可以解决这个问题吗?或者是否有任何必须设置的选项标志?

希望有人对此有更多了解。我真的不相信这是一个错误,因为它是一个如此重要的功能,其他人以前一定遇到过它。

感谢您的帮助!克里斯蒂安

编辑 1

团队项目的文件夹结构是:

$项目名称

  • 构建流程模板
  • 文档
  • 源代码
    • 开发<--这是一个分支
      • 第三方
      • 来源
    • 主要<--这是一个分支
      • 第三方
      • 来源

构建仅拉取主分支及其下面的所有内容。

编辑2

这是构建定义中“工作空间”选项卡的图片: enter image description here

最佳答案

终于我知道发生了什么:

基本上,我的图 1 中可以看到的变更集始终是整个团队项目集合的最新变更集。它是“IBuildDetails”类型的对象“BuildDetails”上的属性“SourceGetVersion”。

我认为这是一个可以解决的错误:如果将 BuildDetails.SourceGetVersion (字符串)更改为其他值,则构建摘要将显示更新后的字符串。此外,它会被正确保存到集合数据库中。

为了添加正确的变更集编号,我所做的是创建了一个自定义构建事件,该事件将应构建的分支作为输入参数。它输出正确的变更集。该事件通过连接到 TFS 并下载历史记录来找出正确的变更集。然后它查看历史记录中的所有项目并输出最大的变更集编号。这是该事件的代码:

using System.Activities;
using System.Collections;
using System.Net;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;
using Microsoft.TeamFoundation.Build.Client;

namespace SourceGetVersionActivity
{
[BuildActivity(HostEnvironmentOption.All)]
public sealed class SourceGetVersionActivity : CodeActivity<string>
{
// Define an activity input argument of type string
public InArgument<string> Branch { get; set; }

// If your activity returns a value, derive from CodeActivity<TResult>
// and return the value from the Execute method.
protected override string Execute(CodeActivityContext context)
{
// Obtain the runtime value of the Text input argument
string branch = context.GetValue(this.Branch);

ICredentials account = new NetworkCredential("Useranme", "password", "domain");

// connect / authenticate with tfs
TeamFoundationServer tfs = new TeamFoundationServer("http://tfs:8080/tfs/CollectionName", account);
tfs.Authenticate();

// get the version control service
VersionControlServer versionControl = (VersionControlServer)tfs.GetService(typeof(VersionControlServer));

IEnumerable changesets = versionControl.QueryHistory(branch, VersionSpec.Latest, 0, RecursionType.Full,
null, null, null, int.MaxValue, false, false, false, false);

int maxVersion = 0;

foreach (Changeset c in changesets)
{
if (c.ChangesetId > maxVersion)
{
maxVersion = c.ChangesetId;
}
}

return string.Concat('C', maxVersion.ToString());
}
}
}

我会尽快调用此事件(在 GetBuild 事件之后)。

基本上,在 BuildProcessTemplate 中,我添加了一个参数(字符串)“Branch”,需要用指向正在构建的顶部文件夹的字符串填充。自定义事件将其作为输入并输出一个字符串,该字符串是正确的变更集 ID。然后,BuildDetail.SourceGetVersion 属性将被正确的变更集 ID 覆盖。

我觉得很奇怪,似乎没有人遇到过这个问题。我在互联网上找不到任何人有同样的问题。无论如何,我希望这个答案也能帮助其他人。

编辑 - 直接在 Workflow Foundation 中编写上述代码:

要使用更紧凑的代码获得正确的变更集并避免自定义事件,也可以直接使用 Workflow Foundation。下面是“代码”(与上面的 C# 代码完全相同):

enter image description here

(1) GetTeamProjectCollection 事件获取当前集合。我将其保存在 TeamProjectCollection 变量中(参见图片底部)。重要提示:该变量需要在此序列内定义,如果在外部作用域中定义它,则会出现错误:“无法序列化类型'Microsoft.TeamFoundation.Client.TfsTeamProjectCollection'。验证该类型是否是公共(public)的并且具有默认构造函数或实例描述符。”

(2) 在“TeamProjectCollection.GetService(Of VersionControlServer).QueryHistory(Branch, VersionSpec.Latest, 0, RecursionType.Full, Nothing, Nothing, Nothing, Integer.MaxValue, False, False, False) 中查找“变更集” .Cast(变更集)()"Foreach 循环的 TypeArgument 是“Microsoft.TeamFoundation.VersionControl.Client.Changeset”。此表达式从集合中获取版本控制对象,将其称为“QueryHistory”方法,该方法返回包含所有更改集的 IEnumerable。

(3) 因此,我们将迭代所有变更集并查看 ChangesetId。然后将最大ChangesetId保存到变量“maxId”中。

(4) 最后,BuildDetails.SourceGetVersion = "C"+ maxId.ToString()。 “C”表示该版本是变更集。

我希望有人发现这段“代码”有用!

基督教

关于TFS2010 - SourceGetVersion 中出现错误的变更集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8322728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com