jes*_*ing 3 continuous-delivery azure-devops azure-pipelines-build-task azure-pipelines-release-pipeline
我正在尝试拼凑一个Release Gate/ServerGate构建任务,调用Web服务,抓住Json,然后决定是否继续.
服务返回的Json看起来像这样:
{
"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
}
Run Code Online (Sandbox Code Playgroud)
我正在基于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')"
}
}
}
Run Code Online (Sandbox Code Playgroud)
关于Expression语法和支持的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)
Run Code Online (Sandbox Code Playgroud)
我已经尝试了许多不同的东西,双重逃逸'或混合"和'.
不幸的是,除了表达式失败之外,服务器没有给我很多信息,因此相当无用.
执行日志如下:
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.
Run Code Online (Sandbox Code Playgroud)
表达式中明确的causign错误给出了一条错误消息,因此表达式至少似乎解析得很好.
为了在不必首先创建整个任务的情况下进行测试,您可以创建一个Invoke REST API Release Gate,如下所示:
并使用以下通用端点:
我不得不决定构建我自己的Expression测试工具(稍后将在我的博客上发布),以便快速迭代不同的表达式并获得更好的错误消息.
以下表达式有效:
eq(count(jsonpath('$.versions[?(@.version==''1.1.12'' && @.flags==''validated'')]')), 1)
Run Code Online (Sandbox Code Playgroud)
您还可以从表达式中提取值,然后使用以下方法对其进行比较:
eq(jsonpath('$.versions[?(@.version==''1.1.12'')].flags')[0], 'validated')
Run Code Online (Sandbox Code Playgroud)
请注意,[0]它标记在jsonpath的结果上.
单引号'需要双重转义,''并且组合表达式的方法在?(a && b)块内.
同时,我发现表达式使用NewtonSoft.Json库来解析表达式,因此它们的表达式语法就是使用它.不幸的是,他们的文档并没有更好.我尝试了几个在线jsonpath测试工具,但那些依赖于Javascript库,它不像Newtonsoft实现那么严格.
你可以在这里找到测试工具.由于依赖于TFS服务器对象模型,它仅在安装TFS 2018更新2或更高版本时才有效(不必配置或在系统上运行):
| 归档时间: |
|
| 查看次数: |
809 次 |
| 最近记录: |