果冻:使用 JSON 对象创建一个 table

jelly: Create a table using JSON object

我正在尝试构建一个 Jenkins Post build plugin,我必须在其中处理 JSON 文件(包含测试结果)并在构建完成后在 Jenkins 中的 tabular format 中显示它已执行。

以下是到目前为止完成的步骤:

  1. 已创建 Jenkins 插件
  2. 能够检索 JSON 文件内容并将其读取为 Google gson JSONElement
  3. 构建 BuildAction(扩展 Action)以显示结果。
  4. 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指的是recordsJSON数组中的每条记录。现在,我想使用 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>

需要帮助使用 JellyJSON 构建 table。也欢迎任何其他实现相同目的的方法(建议相同时请 post 代码示例)。

注意: Groovy 相关答案也欢迎,因为 Jenkins 支持 Jelly and GroovyView

我有兴趣解决您的问题,但由于我无法在本地进行测试,因此可能没有 100% 确定的答案。

您是否尝试过在示例中使用 ${i.objectProps.NAME}${i."objectProps"."NAME"} 而不是 ${i}."objectProps"."NAME"

您还可以查看 g:evaluate 是否可用,因为 jelly 可能不会在未明确告知它这样做的情况下评估您的变量。您可以在 g:evaluate here.

上找到一些文档