我正在使用.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客户端库是否可以实现?还是有一种我可能错过的更容易的方式?
答案 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);