果冻:使用 JSON 对象创建一个 table
jelly: Create a table using JSON object
我正在尝试构建一个 Jenkins Post build plugin
,我必须在其中处理 JSON
文件(包含测试结果)并在构建完成后在 Jenkins
中的 tabular format
中显示它已执行。
以下是到目前为止完成的步骤:
- 已创建 Jenkins 插件
- 能够检索 JSON 文件内容并将其读取为 Google gson
JSONElement
。
- 构建
BuildAction
(扩展 Action)以显示结果。
- 在
index.jelly
(view
for BuildAction
) 对应 BuildAction
中,尝试将 JSON 文件中的每条记录显示为一行。
JSON
文件示例:
{
"records": [{
"objectProps": {
"OTYPE": "TEST",
"NAME": "testMethodError",
}
},
{
"objectProps": {
"OTYPE": "TEST",
"NAME": "testMethodFail",
}
}]
}
构建动作class:
public class BuildAction implements Action {
private JsonElement results;
private Run<?, ?> build;
TaskListener listener;
// this value referred as `it.results` in `index.jelly`
public JsonArray getResults(){
return results.getAsJsonObject().get("records").getAsJsonArray();
}
}
当前 index.jelly
以上 BuildAction
class
<?jelly escape-by-default='true'?>
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:l="/lib/layout">
<l:layout>
<st:include it="${it.build}" page="sidepanel.jelly"/>
<l:main-panel>
<table> Test - Wise Results
<j:forEach items="${it.results}" var="i">
<tr><td>Test case name: ${i}</td></tr>
</j:forEach>
</table>
</l:main-panel>
</l:layout>
</j:jelly>
实际行为:
截至目前,${results}
值为 JSONArray
类型。 forEach 在果冻中,我可以迭代并使用 var i
(语法 ${i}
)获取记录。 i
指的是records
JSON数组中的每条记录。现在,我想使用 i
访问 objectProps.NAME
字段,我不知道 Jelly 中的语法可以实现相同的目的。
预期行为:
我想遍历 JSON 文件中的 records
数组,每个 child/jsonObject 作为一个 table 行(及其值作为相应的列)。
类似于此(访问 NAME
值):
<j:forEach items="${it.results}" var="i">
<tr><td>Test case name: ${i}."objectProps"."NAME"</td></tr>
</j:forEach>
需要帮助使用 Jelly
从 JSON
构建 table
。也欢迎任何其他实现相同目的的方法(建议相同时请 post 代码示例)。
注意: Groovy
相关答案也欢迎,因为 Jenkins
支持 Jelly and Groovy
和 View
。
我有兴趣解决您的问题,但由于我无法在本地进行测试,因此可能没有 100% 确定的答案。
您是否尝试过在示例中使用 ${i.objectProps.NAME}
或 ${i."objectProps"."NAME"}
而不是 ${i}."objectProps"."NAME"
?
您还可以查看 g:evaluate
是否可用,因为 jelly 可能不会在未明确告知它这样做的情况下评估您的变量。您可以在 g:evaluate
here.
上找到一些文档
我正在尝试构建一个 Jenkins Post build plugin
,我必须在其中处理 JSON
文件(包含测试结果)并在构建完成后在 Jenkins
中的 tabular format
中显示它已执行。
以下是到目前为止完成的步骤:
- 已创建 Jenkins 插件
- 能够检索 JSON 文件内容并将其读取为 Google gson
JSONElement
。 - 构建
BuildAction
(扩展 Action)以显示结果。 - 在
index.jelly
(view
forBuildAction
) 对应BuildAction
中,尝试将 JSON 文件中的每条记录显示为一行。
JSON
文件示例:
{
"records": [{
"objectProps": {
"OTYPE": "TEST",
"NAME": "testMethodError",
}
},
{
"objectProps": {
"OTYPE": "TEST",
"NAME": "testMethodFail",
}
}]
}
构建动作class:
public class BuildAction implements Action {
private JsonElement results;
private Run<?, ?> build;
TaskListener listener;
// this value referred as `it.results` in `index.jelly`
public JsonArray getResults(){
return results.getAsJsonObject().get("records").getAsJsonArray();
}
}
当前 index.jelly
以上 BuildAction
class
<?jelly escape-by-default='true'?>
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:l="/lib/layout">
<l:layout>
<st:include it="${it.build}" page="sidepanel.jelly"/>
<l:main-panel>
<table> Test - Wise Results
<j:forEach items="${it.results}" var="i">
<tr><td>Test case name: ${i}</td></tr>
</j:forEach>
</table>
</l:main-panel>
</l:layout>
</j:jelly>
实际行为:
截至目前,${results}
值为 JSONArray
类型。 forEach 在果冻中,我可以迭代并使用 var i
(语法 ${i}
)获取记录。 i
指的是records
JSON数组中的每条记录。现在,我想使用 i
访问 objectProps.NAME
字段,我不知道 Jelly 中的语法可以实现相同的目的。
预期行为:
我想遍历 JSON 文件中的 records
数组,每个 child/jsonObject 作为一个 table 行(及其值作为相应的列)。
类似于此(访问 NAME
值):
<j:forEach items="${it.results}" var="i">
<tr><td>Test case name: ${i}."objectProps"."NAME"</td></tr>
</j:forEach>
需要帮助使用 Jelly
从 JSON
构建 table
。也欢迎任何其他实现相同目的的方法(建议相同时请 post 代码示例)。
注意: Groovy
相关答案也欢迎,因为 Jenkins
支持 Jelly and Groovy
和 View
。
我有兴趣解决您的问题,但由于我无法在本地进行测试,因此可能没有 100% 确定的答案。
您是否尝试过在示例中使用 ${i.objectProps.NAME}
或 ${i."objectProps"."NAME"}
而不是 ${i}."objectProps"."NAME"
?
您还可以查看 g:evaluate
是否可用,因为 jelly 可能不会在未明确告知它这样做的情况下评估您的变量。您可以在 g:evaluate
here.