使用 TFS 2015 .NET 客户端库从模板创建构建定义

2023-12-08

我正在使用.NET 客户端库VSTS/TFS 2015 根据我在另一个团队项目中获取的模板以编程方式创建构建定义。

我可以使用以下方法获取构建定义模板(2.0):

BuildDefinitionTemplate builddeftemplate = buildHttpClient.GetTemplateAsync(teamProject, templateId).Result;

我可以使用以下方法创建构建定义:

BuildDefinition builddef = new BuildDefinition();
builddef.Project = newTeamProject;

但看起来没有办法将模板作为构建定义的属性传递,也没有从模板创建构建定义。

查看 REST API 的文档时,GET 请求实际上看起来会返回大量 JSON:

{
  "id": "vsBuild",
  "name": "Visual Studio",
  "canDelete": false,
  "category": "Build",
  "iconTaskId": "71a9a2d3-a98a-4caa-96ab-affca411ecda",
  "description": "Build and run tests using Visual Studio. This template requires that Visual Studio be installed on the build agent.",
  "template": {
    "build": [
      {
        "enabled": true,
        "continueOnError": false,
        "alwaysRun": false,
        "task": {
          "id": "71a9a2d3-a98a-4caa-96ab-affca411ecda",
          "versionSpec": "*"
        },
        "inputs": {
          "solution": "**\\*.sln",
          "msbuildLocation": "",
          "vsLocation": "",
          "msbuildArgs": "",
          "platform": "$(BuildPlatform)",
          "configuration": "$(BuildConfiguration)",
          "clean": "false"
        }
      },
      ...

因此,我认为可能只获取返回模板的一部分作为 JSON 对象,并通过这些部分传递构建定义的 POST,但似乎这只能是 REST API 路由。

.NET 客户端库可以实现这一点吗?还是有一种我可能错过的更简单的方法?


没有办法将模板作为构建定义的属性传递。然而,还有另一种方法可以实现它。您可以通过 .net 库在团队项目之间克隆/导入/导出构建定义。

    var cred = new VssCredentials(new WindowsCredential(new NetworkCredential(username, password)));
    var buildClient = new BuildHttpClient(new Uri(collectionURL, UriKind.Absolute), cred);
     
    var buildDef = (await buildClient.GetDefinitionAsync(sourceProj, buildDefId)) as BuildDefinition;
     
    buildDef.Project = null;
    buildDef.Name += "_clone";
     
    await buildClient.CreateDefinitionAsync(buildDef, targetProj);

从上面的代码中,您可以对团队服务器进行身份验证,并通过提供项目名称和构建定义 ID 从源项目中检索构建定义对象。

然后您需要删除对该项目的引用。由于构建定义包含对项目的引用,因此无法将其导入到不同的项目中。最后在目标项目中创建一个新的构建定义,提供从先前项目中检索的定义对象。

下一步是将构建定义导出到文件中,以便我们稍后可以导入它。通过使用 json 序列化器序列化构建定义并将其保存到文件中。

   var buildDef = (await buildClient.GetDefinitionAsync(project, buildDefId)) as BuildDefinition;
   buildDef.Project = null;
   File.WriteAllText(filePath, JsonConvert.SerializeObject(buildDef));

最后添加一个导入方法,更多细节请参考这里link

if (!File.Exists(filePath))
      throw new FileNotFoundException("File does not exist!", filePath);
    Console.WriteLine($"Importing build definition from file '{filePath}' to '{project}' project.");
    var buildDef = JsonConvert.DeserializeObject<BuildDefinition>(File.ReadAllText(filePath));
    buildDef.Name = newBuildName;
    await buildClient.CreateDefinitionAsync(buildDef, project);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 TFS 2015 .NET 客户端库从模板创建构建定义 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 文件提取失败:在 ExtractFiles@1 中

    我有一个 React js 应用程序 当前为 Azure CI CD 管道设置 突然它在发布阶段开始失败 它正在成功构建 我可以看到在工件中创建的 zip 文件 提取文件任务集在遵循方式 https learn microsoft com
  • 我可以查看带有标签的 TFS 文件历史记录吗?

    目前 我们在工作中同时使用 Visual Source Safe 和 Team Foundation Server 对于旧项目使用 VSS 对于当前或新项目使用 TFS 我们始终在每个构建的源代码管理中使用标签 在 VSS 中 如果您选择查
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐