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

时间:2016-08-24 23:57:50

标签: c# tfs azure-devops

我正在使用.NET Client Libraries for VSTS / TFS 2015以编程方式创建基于我在其他团队项目中获取的模板的构建定义。

我可以使用:

获取构建定义模板(2.0)
BuildDefinition builddef = new BuildDefinition();
builddef.Project = newTeamProject;

我可以使用:

创建构建定义
{
  "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"
        }
      },
      ...

但是看起来不像是将模板作为构建定义的属性传递,也不是从模板创建构建定义。

在查看REST API的文档时,GET请求实际上看起来像是返回了很多JSON:

var value = '2 a s 2 s 2 a';
var valueInValid = 'a a a a a 2'
var valueDigits = '12321 asda 12312  2';

var letters = /([a-zA-Z]+\s)*[a-zA-Z]+$/; // only letters with no more than 2 spaces
var digits = /[\d+\s]*[\d]+$/; // only digits with no more than 2 spaces

var lettersDigits = /[a-zA-Z\d+\s]*[a-zA-Z\d]+$/; // digits and letters allowed no special characters no more than 2 spaces

if (letters.test(value) == false) {
$("#output").text("invalid");
} else {
$("#output").text("valid");
}

if (letters.test(valueInValid) == false) {
$("#output2").text("invalid");
} else {
$("#output2").text("valid");
}


if (digits.test(valueDigits) == false) {
$("#output3").text("invalid");
} else {
$("#output3").text("valid");
}


if (lettersDigits.test(value) == false) {
$("#output4").text("invalid");
} else {
$("#output4").text("valid");
}


<div id="output"></div> /* returns valid */
<div id="output2"></div> /* returns invalid */
<div id="output3"></div> /* returns valid */
<div id="output4"></div> /* returns valid */

所以我认为有可能只将部分返回的模板作为JSON对象获取并通过这些部分传递构建定义的POST,但似乎只需要REST API路径。

.NET客户端库是否可以实现?还是有一种我可能错过的更容易的方式?

1 个答案:

答案 0 :(得分:3)

没有办法将模板作为构建定义的属性传递。但是,还有另一种方法可以实现它。您可以通过.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);