2017-01-25 2 views
1

Ich versuche, eine Jenkins Post build plugin zu erstellen, wo ich JSON Datei verarbeiten muss (enthält Testergebnisse) und zeigen Sie in tabular format in Jenkins sobald Build ausgeführt wird.Gelee: Erstellen Sie eine Tabelle mit JSON-Objekt

Im Folgenden sind die Schritte bis jetzt getan:

  1. Erstellt Jenkins Plugin
  2. Able JSON-Datei Inhalt abzurufen und zu lesen, wie Google JSONElement Gson.
  3. Gebaut BuildAction (erweitert Aktion), um die Ergebnisse anzuzeigen.
  4. In index.jelly (view für BuildAction) entsprechend BuildAction, versuchen, jeden Datensatz in JSON-Datei als Zeile anzuzeigen.

JSON Datei Beispiel:

{ 
    "records": [{ 
     "objectProps": { 
      "OTYPE": "TEST", 
      "NAME": "testMethodError", 

     } 
    }, 
    { 
     "objectProps": { 
      "OTYPE": "TEST", 
      "NAME": "testMethodFail", 
     } 
    }] 
} 

Buildaction-Klasse:

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(); 
    } 

} 

aktuellen index.jelly für oben BuildAction Klasse

<?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> 

Act Verhalten:

Ab sofort ist ${results} Wert von JSONArray Typ. forEach in Gelee, kann ich über iterieren und den Datensatz mit var i (Syntax ${i}) erhalten. i bezieht sich auf jeden Datensatz in records JSONArray. Nun möchte ich objectProps.NAME Feld mit i zugreifen, ich weiß nicht die Syntax in Jelly, um das gleiche zu erreichen.

erwartetes Verhalten:

I durch records Array in JSON Datei und jedes Kind/JsonObject als eine Tabellenzeile (und ihre Werte als entsprechende Spalten) iterieren wan.

etwas Ähnliches wie diese (für den Zugriff NAME Wert):

<j:forEach items="${it.results}" var="i"> 
    <tr><td>Test case name: ${i}."objectProps"."NAME"</td></tr> 
</j:forEach> 

beim Aufbau der table aus einem JSON mit Jelly Hilfe brauchen. Jeder andere Weg, um das gleiche zu erreichen, ist ebenfalls willkommen (bitte Code-Beispiele beifügen, wenn Sie dasselbe vorschlagen).

Hinweis:Groovy bezogene Antwort auch willkommen, da Jenkins Unterstützung sowohl Jelly and Groovy für View.

Antwort

1

Ich bin daran interessiert, Ihr Problem zu lösen, aber möglicherweise keine 100% sichere Antwort, da ich nicht lokal testen kann.

Haben Sie in Ihrem Beispiel versucht, ${i.objectProps.NAME} oder ${i."objectProps"."NAME"} anstelle von ${i}."objectProps"."NAME" zu verwenden?

Sie können auch sehen, ob g:evaluate verfügbar ist, da Jelly Ihre Variable möglicherweise nicht auswertet, ohne sie explizit dazu zu sagen. Sie können einige Dokumentation finden auf g:evaluatehere.

+0

Zuerst muss ich Ihre Begeisterung schätzen. und ja, es hat für mich funktioniert. '$ {i.objectProps.NAME}' hat mir den Wert in Anführungszeichen gebracht (zB: 'Name des Testfalls:" testMethodError "'). 1. Gibt es eine Möglichkeit, sie zu entfernen und nur Inhalte anzuzeigen? Ich denke 'g: evaluate' ist spezifisch für' serviceNow', aber nicht Teil von 'Apache Jelly'. 2. Sind Sie sicher, dass wir das nutzen können? Ich habe das müde. Es hat zwar keinen Fehler ausgelöst, aber es als "Klartext" anstelle von "Javascript" ausgeführt. –

+0

1) Nach dem, was ich gesehen habe, wird alles in '$ {}' als grooviger Code ausgeführt. Ich bin mir nicht bewusst, woher diese doppelten Anführungszeichen kommen könnten, Sie könnten versuchen, sie dort mit etwas wie '$ {i.objectProps.NAME.replace (/ needRegEx /," ")}' zu entfernen. Das würde funktionieren, wenn sie in Ihren Daten sind, wenn Gelee sie addiert, dann könnte es möglicherweise komplizierter sein. 2) Ich war mir nicht sicher, ob es funktioniert, aber es scheint wirklich spezifisch für 'serviceNow' zu sein. – Bricktop

+0

ok. Vielen Dank. Ich werde es ausprobieren. kann keine Kopfgelder anbieten, bis ein Tag nach dem Start abgeschlossen ist. Also, werde ich anbieten, sobald ich das Privileg habe. Eine weitere Herausforderung, der ich mich gegenübersehe ist, dass ich versuche, 'index.jelly' in' index.groovy' zu konvertieren. Aber in der Zeile 'st.include (it: it.build, page:" sidepanel.jelly ")', verursacht die Null Pointer-Ausnahme. Wenn du weißt, kannst du bitte die 'groovy' Version von oben' index.jelly' posten? –

Verwandte Themen