Continuous integration 如何从VisualStudioTeamServices导出测试结果
我在VisualStudioTeamServices中有两个项目:一个用于服务器端代码,另一个用于javascript丰富的UI。我现在正试图为团队设置一个仪表板,以查看构建状态和测试覆盖率之类的内容,但我不知道如何从VisualStudioTeamServices中获取数据,也不知道这样做是否可行 我已经尝试为项目创建一个服务钩子,并附加一个新的WebHook订户。然后将一个JSON对象发布到我的仪表板,其中包含它将允许我发送的所有信息。下面是设置WebHook时“测试”按钮的示例:Continuous integration 如何从VisualStudioTeamServices导出测试结果,continuous-integration,tfsbuild,azure-devops,Continuous Integration,Tfsbuild,Azure Devops,我在VisualStudioTeamServices中有两个项目:一个用于服务器端代码,另一个用于javascript丰富的UI。我现在正试图为团队设置一个仪表板,以查看构建状态和测试覆盖率之类的内容,但我不知道如何从VisualStudioTeamServices中获取数据,也不知道这样做是否可行 我已经尝试为项目创建一个服务钩子,并附加一个新的WebHook订户。然后将一个JSON对象发布到我的仪表板,其中包含它将允许我发送的所有信息。下面是设置WebHook时“测试”按钮的示例: {
{
"subscriptionId": "2d0988c2-e1a6-45b7-ada0-cf3355beeb9f",
"notificationId": 4,
"id": "4a5d99d6-1c75-4e53-91b9-ee80057d4ce3",
"eventType": "build.complete",
"publisherId": "tfs",
"message": {
"text": "Build ConsumerAddressModule_20150407.2 succeeded",
"html": "Build <a href=\"https://fabrikam-fiber-inc.visualstudio.com/web/build.aspx?pcguid=5023c10b-bef3-41c3-bf53-686c4e34ee9e&builduri=vstfs%3a%2f%2f%2fBuild%2fBuild%2f3\">ConsumerAddressModule_20150407.2</a> succeeded",
"markdown": "Build [ConsumerAddressModule_20150407.2](https://fabrikam-fiber-inc.visualstudio.com/web/build.aspx?pcguid=5023c10b-bef3-41c3-bf53-686c4e34ee9e&builduri=vstfs%3a%2f%2f%2fBuild%2fBuild%2f3) succeeded"
},
"detailedMessage": {
"text": "Build ConsumerAddressModule_20150407.2 succeeded",
"html": "Build <a href=\"https://fabrikam-fiber-inc.visualstudio.com/web/build.aspx?pcguid=5023c10b-bef3-41c3-bf53-686c4e34ee9e&builduri=vstfs%3a%2f%2f%2fBuild%2fBuild%2f3\">ConsumerAddressModule_20150407.2</a> succeeded",
"markdown": "Build [ConsumerAddressModule_20150407.2](https://fabrikam-fiber-inc.visualstudio.com/web/build.aspx?pcguid=5023c10b-bef3-41c3-bf53-686c4e34ee9e&builduri=vstfs%3a%2f%2f%2fBuild%2fBuild%2f3) succeeded"
},
"resource": {
"uri": "vstfs:///Build/Build/2",
"id": 2,
"buildNumber": "ConsumerAddressModule_20150407.1",
"url": "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/71777fbc-1cf2-4bd1-9540-128c1c71f766/_apis/build/Builds/2",
"startTime": "2015-04-07T18:04:06.83Z",
"finishTime": "2015-04-07T18:06:10.69Z",
"reason": "manual",
"status": "succeeded",
"dropLocation": "#/3/drop",
"drop": {
"location": "#/3/drop",
"type": "container",
"url": "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/resources/Containers/3/drop",
"downloadUrl": "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/resources/Containers/3/drop?api-version=1.0&$format=zip&downloadFileName=ConsumerAddressModule_20150407.1_drop"
},
"log": {
"type": "container",
"url": "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/resources/Containers/3/logs",
"downloadUrl": "https://fabrikam-fiber-inc.visualstudio.com/_apis/resources/Containers/3/logs?api-version=1.0&$format=zip&downloadFileName=ConsumerAddressModule_20150407.1_logs"
},
"sourceGetVersion": "LG:refs/heads/master:600c52d2d5b655caa111abfd863e5a9bd304bb0e",
"lastChangedBy": {
"id": "d6245f20-2af8-44f4-9451-8107cb2767db",
"displayName": "Normal Paulk",
"uniqueName": "fabrikamfiber16@hotmail.com",
"url": "https://fabrikam-fiber-inc.visualstudio.com/_apis/Identities/d6245f20-2af8-44f4-9451-8107cb2767db",
"imageUrl": "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_api/_common/identityImage?id=d6245f20-2af8-44f4-9451-8107cb2767db"
},
"retainIndefinitely": false,
"hasDiagnostics": true,
"definition": {
"batchSize": 1,
"triggerType": "none",
"definitionType": "xaml",
"id": 2,
"name": "ConsumerAddressModule",
"url": "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/71777fbc-1cf2-4bd1-9540-128c1c71f766/_apis/build/Definitions/2"
},
"queue": {
"queueType": "buildController",
"id": 4,
"name": "Hosted Build Controller",
"url": "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/build/Queues/4"
},
"requests": [{
"id": 1,
"url": "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/71777fbc-1cf2-4bd1-9540-128c1c71f766/_apis/build/Requests/1",
"requestedFor": {
"id": "d6245f20-2af8-44f4-9451-8107cb2767db",
"displayName": "Normal Paulk",
"uniqueName": "fabrikamfiber16@hotmail.com",
"url": "https://fabrikam-fiber-inc.visualstudio.com/_apis/Identities/d6245f20-2af8-44f4-9451-8107cb2767db",
"imageUrl": "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_api/_common/identityImage?id=d6245f20-2af8-44f4-9451-8107cb2767db"
}
}]
},
"resourceVersion": "1.0",
"resourceContainers": {
"collection": {
"id": "c12d0eb8-e382-443b-9f9c-c52cba5014c2"
},
"account": {
"id": "f844ec47-a9db-4511-8281-8b63f4eaf94e"
},
"project": {
"id": "be9b3917-87e6-42a4-a549-2bc06a7a878f"
}
},
"createdDate": "2016-04-27T14:45:20.8150184Z"
}
{
“订阅ID”:“2d0988c2-e1a6-45b7-ada0-cf3355beeb9f”,
“通知ID”:4,
“id”:“4a5d99d6-1c75-4e53-91b9-ee80057d4ce3”,
“eventType”:“build.complete”,
“publisherId”:“tfs”,
“信息”:{
“文本”:“构建ConsumerAddressModule_20150407.2成功”,
“html”:“构建成功”,
“降价”:“构建[ConsumerAddressModule_20150407.2](https://fabrikam-fiber-inc.visualstudio.com/web/build.aspx?pcguid=5023c10b-bef3-41c3-bf53-686c4e34ee9e&builduri=vstfs%3a%2f%2f%2f构建%2f构建%2f3)成功“
},
“详细信息”:{
“文本”:“构建ConsumerAddressModule_20150407.2成功”,
“html”:“构建成功”,
“降价”:“构建[ConsumerAddressModule_20150407.2](https://fabrikam-fiber-inc.visualstudio.com/web/build.aspx?pcguid=5023c10b-bef3-41c3-bf53-686c4e34ee9e&builduri=vstfs%3a%2f%2f%2f构建%2f构建%2f3)成功“
},
“资源”:{
“uri”:vstfs:///Build/Build/2",
“id”:2,
“建筑编号”:“ConsumerAddressModule_20150407.1”,
“url”:”https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/71777fbc-1cf2-4bd1-9540-128c1c71f766/_apis/build/Builds/2",
“开始时间”:“2015-04-07T18:04:06.83Z”,
“完成时间”:“2015-04-07T18:06:10.69Z”,
“原因”:“手册”,
“状态”:“成功”,
“放置位置”:“#/3/放置”,
“下降”:{
“位置”:“#/3/下降”,
“类型”:“容器”,
“url”:”https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/resources/Containers/3/drop",
“下载URL”:https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/resources/Containers/3/drop?api-version=1.0&$format=zip&downloadFileName=ConsumerAddressModule\u 20150407.1\u drop“
},
“日志”:{
“类型”:“容器”,
“url”:”https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/resources/Containers/3/logs",
“下载URL”:https://fabrikam-fiber-inc.visualstudio.com/_apis/resources/Containers/3/logs?api-version=1.0&$format=zip&downloadFileName=ConsumerAddressModule\u 20150407.1\u日志”
},
“sourceGetVersion:“LG:refs/heads/master:600C52D2DB5B655CAA111ABFD863E5A9BD304BB0E”,
“lastChangedBy”:{
“id”:“d6245f20-2af8-44f4-9451-8107cb2767db”,
“displayName”:“普通保尔克”,
“uniqueName”:”fabrikamfiber16@hotmail.com",
“url”:”https://fabrikam-fiber-inc.visualstudio.com/_apis/Identities/d6245f20-2af8-44f4-9451-8107cb2767db",
“imageUrl”:https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_api/_common/identityImage?id=d6245f20-2af8-44f4-9451-8107cb2767db“
},
“保留有限”:假,
“hasDiagnostics”:没错,
“定义”:{
“批量大小”:1,
“triggerType”:“无”,
“定义类型”:“xaml”,
“id”:2,
“名称”:“ConsumerAddressModule”,
“url”:”https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/71777fbc-1cf2-4bd1-9540-128c1c71f766/_apis/build/Definitions/2"
},
“队列”:{
“queueType”:“buildController”,
“id”:4,
“名称”:“托管生成控制器”,
“url”:”https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/build/Queues/4"
},
“请求”:[{
“id”:1,
“url”:”https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/71777fbc-1cf2-4bd1-9540-128c1c71f766/_apis/build/Requests/1",
“requestedFor”:{
“id”:“d6245f20-2af8-44f4-9451-8107cb2767db”,
“displayName”:“普通保尔克”,
“uniqueName”:”fabrikamfiber16@hotmail.com",
“url”:”https://fabrikam-fiber-inc.visualstudio.com/_apis/Identities/d6245f20-2af8-44f4-9451-8107cb2767db",
“imageUrl”:https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_api/_common/identityImage?id=d6245f20-2af8-44f4-9451-8107cb2767db“
}
}]
},
“资源版本”:“1.0”,
“资源容器”:{
“收藏”:{
“id”:“c12d0eb8-e382-443b-9f9c-c52cba5014c2”
},
“账户”:{
“id”:“f844ec47-a9db-4511-8281-8b63f4eaf94e”
},
“项目”:{
“id”:“be9b3917-87e6-42a4-a549-2bc06a7a878f”
}
},
“createdDate”:“2016-04-27T14:45:20.8150184Z”
}
资源
属性中有几个有用的字段,例如状态
、开始时间
和完成时间
(我可以从中计算出构建所用的时间)。但是关于测试没有任何内容
在我的UI项目中,测试和覆盖都有一个发布步骤,将结果保存到构建服务器上的XML文件中。因此,目前我能看到的与仪表板共享更详细信息的唯一方法是编写一个自定义脚本,读取这些XML文件并将其发布到RESTAPI,作为构建的最后一步
如果有人知道一种更干净的方法让VST做我需要的事情,我洗耳恭听。您想要的信息存储在“测试运行”中。当您为“Build Completed”事件创建服务钩子时,它只发送包含的信息