Azure devops 在Release Gate或ServerGate任务上解析Json成功条件
我试图拼凑一个发布门/服务器门构建任务,调用一个Web服务,获取Json,然后决定是否继续 服务返回的Json如下所示:Azure devops 在Release Gate或ServerGate任务上解析Json成功条件,azure-devops,azure-pipelines-release-pipeline,azure-pipelines-build-task,continuous-delivery,Azure Devops,Azure Pipelines Release Pipeline,Azure Pipelines Build Task,Continuous Delivery,我试图拼凑一个发布门/服务器门构建任务,调用一个Web服务,获取Json,然后决定是否继续 服务返回的Json如下所示: { "publisher": { "publisherId": "c68591c6-8fbd-413b-b7fb-b921737f4f9f", "publisherName": "jessehouwing", "displayName": "Jesse Houwing", "flags": "verifi
{
"publisher": {
"publisherId": "c68591c6-8fbd-413b-b7fb-b921737f4f9f",
"publisherName": "jessehouwing",
"displayName": "Jesse Houwing",
"flags": "verified"
},
"extensionId": "252ad2b4-a2c5-43fc-bba5-17e631896091",
"extensionName": "vsts-snyk",
"displayName": "Snyk Task",
"flags": "validated, public",
"lastUpdated": "2018-03-16T18:58:36.327Z",
"publishedDate": "2016-11-16T21:35:28.387Z",
"releaseDate": "2016-11-16T21:35:28.387Z",
"shortDescription": "Snyk continuously finds and fixes vulnerabilities in your dependencies.",
"versions": [
{
"version": "1.1.12",
"flags": "validated",
"lastUpdated": "2018-03-16T18:58:53.133Z"
},
{
"version": "1.1.11",
"flags": "validated",
"lastUpdated": "2018-02-18T13:53:47.83Z"
}
],
"deploymentType": 0
}
我正在基于task.json中的HttpHandler执行处理程序调用服务:
"execution": {
"HttpRequest": {
"Execute": {
"EndpointId": "$(connectedServiceName)",
"EndpointUrl": "$(endpoint.url)_apis/gallery/publishers/$(publisherId)/extensions/$(extensionId)$(extensionTag)?flags=1",
"Method": "GET",
"Body": "",
"Headers": "{\"Content-Type\":\"application/json\"}",
"WaitForCompletion": "false",
"Expression": "eq(jsonpath('$.versions[?(@.version==$(extensionVersion))].flags'), 'validated')"
}
}
}
关于表达式语法和支持的jsonpath语法的文档很少。我从以下网站中窃取了大部分示例:
eq(jsonpath('$.versions[?(@.version==$(extensionVersion))].flags'), 'validated')
eq(count(jsonpath('$.versions[?(@.version==$(extensionVersion)), ?(@.flags==validated)]')), 1)
eq(count(jsonpath('$.versions[?(@.version==$(extensionVersion)) && ?(@.flags==validated)]')), 1)
我尝试了许多不同的方法,比如双重转义,
或混合“
和,
不幸的是,除了表达式失败之外,服务器没有给我很多信息,因此毫无用处
执行日志如下所示:
2018-04-01T13:34:51.2938460Z GET https://marketplace.visualstudio.com/_apis/gallery/publishers/jessehouwing/extensions/vsts-snyk?flags=1
Response Code: OK
Response: {"publisher":{"publisherId":"c68591c6-8fbd-413b-b7fb-b921737f4f9f","publisherName":"jessehouwing","displayName":"Jesse Houwing","flags":"verified"},"extensionId":"252ad2b4-a2c5-43fc-bba5-17e631896091","extensionName":"vsts-snyk","displayName":"Snyk Task","flags":"validated, public","lastUpdated":"2018-03-16T18:58:36.327Z","publishedDate":"2016-11-16T21:35:28.387Z","releaseDate":"2016-11-16T21:35:28.387Z","shortDescription":"Snyk continuously finds and fixes vulnerabilities in your dependencies.","versions":[{"version":"1.1.12","flags":"validated","lastUpdated":"2018-03-16T18:58:53.133Z"},{"version":"1.1.11","flags":"validated","lastUpdated":"2018-02-18T13:53:47.83Z"},{"version":"1.1.9","flags":"validated","lastUpdated":"2017-03-14T09:40:40.75Z"},{"version":"1.1.8","flags":"validated","lastUpdated":"2017-03-13T19:50:57.603Z"},{"version":"1.1.7","flags":"validated","lastUpdated":"2017-03-13T19:45:29.647Z"},{"version":"1.1.6","flags":"validated","lastUpdated":"2017-02-21T10:58:40.617Z"},{"version":"1.1.3","flags":"validated","lastUpdated":"2017-02-21T10:46:02.86Z"},{"version":"1.1.2","flags":"validated","lastUpdated":"2017-02-21T10:42:05.503Z"},{"version":"1.0.21","flags":"validated","lastUpdated":"2017-01-12T20:54:40.587Z"},{"version":"1.0.20","flags":"validated","lastUpdated":"2017-01-12T20:19:58.767Z"},{"version":"1.0.19","flags":"validated","lastUpdated":"2017-01-12T20:14:43.677Z"},{"version":"1.0.17","flags":"validated","lastUpdated":"2017-01-04T18:49:51.233Z"},{"version":"1.0.16","flags":"validated","lastUpdated":"2017-01-04T10:27:29.48Z"},{"version":"1.0.5","flags":"validated","lastUpdated":"2016-12-15T12:00:16.027Z"},{"version":"1.0.4","flags":"validated","lastUpdated":"2016-12-02T20:03:02.753Z"},{"version":"1.0.3","flags":"validated","lastUpdated":"2016-12-01T18:56:42.703Z"},{"version":"1.0.1","flags":"validated","lastUpdated":"2016-11-29T20:25:24.887Z"},{"version":"0.9.17","flags":"validated","lastUpdated":"2016-11-29T18:41:15.72Z"},{"version":"0.9.16","flags":"validated","lastUpdated":"2016-11-29T16:07:54.787Z"},{"version":"0.9.13","flags":"validated","lastUpdated":"2016-11-29T15:22:14.327Z"},{"version":"0.9.12","flags":"validated","lastUpdated":"2016-11-26T13:38:01.453Z"},{"version":"0.9.9","flags":"validated","lastUpdated":"2016-11-21T23:03:30.797Z"},{"version":"0.9.7","flags":"validated","lastUpdated":"2016-11-20T13:20:51.503Z"},{"version":"0.9.3","flags":"validated","lastUpdated":"2016-11-19T13:38:40.32Z"},{"version":"0.9.2","flags":"validated","lastUpdated":"2016-11-16T21:35:36.59Z"}],"deploymentType":0}
Evaluation of expression 'eq(count(jsonpath('$.versions[?(@.version==''1.1.12''),?(@.flags==''validated'')]')), 1)' failed.
表达式中的显式causign errors会给我一条错误消息,因此表达式至少看起来解析得很好
为了在不必首先创建整个任务的情况下进行测试,您可以创建一个调用REST API发布门,如下所示:
并使用以下通用端点:
- 网址:
- 密码:PAT(所有帐户)
eq(count(jsonpath('$.versions[?(@.version==''1.1.12'' && @.flags==''validated'')]')), 1)
还可以从表达式中提取值,然后使用以下方法进行比较:
eq(jsonpath('$.versions[?(@.version==''1.1.12'')].flags')[0], 'validated')
注意标记在jsonpath结果上的[0]
单引号“
需要双转义”
,组合表达式的方法在?(a和&b)
块中
同时,我发现表达式使用NewtonSoft.Json库来解析表达式,因此它们的表达式语法就是要使用的语法。我尝试了两个在线jsonpath测试工具,但这些工具依赖的Javascript库没有NewtonSoft实现那么严格
偷窥本地验证工具:
您可以在此处找到测试工具。由于对TFS服务器对象模型的依赖性,它仅在安装了TFS 2018 update 2或更高版本(无需配置或在您的系统上运行)时起作用:
{“Items”:[{“name”:“item1”,“price”:100},{“name”:“item2”,“price”:40},{“name”:“item3”,“price”:70}
表达式是eq(count)(jsonpath:'Items[?(@.price)]