2017-01-25 2 views
1

Je suis en train de construire un Jenkins Post build plugin où je dois traiter le fichier JSON (contient les résultats des tests) et l'afficher dans tabular format en Jenkins une fois la construction est exécutée.gelée: Créer une table à l'aide objet JSON

Voici les étapes effectuées jusqu'à présent:

  1. Créé plug-in Jenkins
  2. Capable de récupérer le contenu du fichier JSON et lire comme Google gson JSONElement.
  3. Construit BuildAction (étend action) pour afficher les résultats.
  4. En index.jelly (view pour BuildAction) correspondant à BuildAction, en essayant d'afficher chaque enregistrement dans le fichier JSON, en tant que ligne.

JSON échantillon de fichier:

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

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

classe BuildAction:

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 actuel au-dessus BuildAction classe

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

Loi Comportement final:

A partir de maintenant, la valeur ${results} est de type JSONArray. forEach en gelée, je suis capable de parcourir et d'obtenir l'enregistrement en utilisant var i (syntaxe ${i}). i fait référence à chaque enregistrement dans records JSONArray. Maintenant, je veux accéder au champ objectProps.NAME en utilisant i, je ne connais pas la syntaxe dans Jelly pour atteindre la même chose.

comportement attendu:

I wan pour itérer tableau records dans le fichier JSON et chaque enfant/JsonObject comme une ligne de la table (et ses valeurs en tant que colonnes correspondantes).

quelque chose de similaire à ce (pour accéder valeur NAME):

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

Besoin d'aide dans la construction de l'table d'un JSON en utilisant Jelly. Toute autre façon de réaliser la même chose est la bienvenue (s'il vous plaît envoyer des exemples de code en suggérant la même chose).

Note:Groovy réponse concernant également les bienvenus comme Jenkins soutien à la fois Jelly and Groovy pour View.

Répondre

1

Je suis intéressé à résoudre votre problème, mais peut ne pas avoir une réponse 100% certaine car je ne peux pas tester localement. Avez-vous essayé d'utiliser ${i.objectProps.NAME} ou ${i."objectProps"."NAME"} au lieu de ${i}."objectProps"."NAME" dans votre exemple?

Vous pouvez également voir si g:evaluate est disponible, car il se peut que jelly n'évalue pas votre variable sans lui dire explicitement de le faire. Vous pouvez trouver de la documentation sur g:evaluatehere.

+0

D'abord, je dois apprécier votre enthousiasme. et oui, ça a marché pour moi. '$ {i.objectProps.NAME}' m'a donné la valeur entre guillemets (par exemple: 'Test case name:" testMethodError "'). 1. Y a-t-il un moyen de les supprimer et d'afficher uniquement du contenu? Je pense que «g: evaluate» est spécifique à la société «serviceNow» mais ne fait pas partie de «Apache Jelly». 2. Êtes-vous sûr de pouvoir l'utiliser? Je me suis fatigué. Bien qu'il n'ait pas jeté d'erreur, mais l'exécutant comme 'plain text' au lieu de' javascript'. –

+0

1) A en juger par ce que j'ai vu, tout ce qui est dans '$ {}' est exécuté sous forme de code groovy. Je ne suis pas au courant d'où ces doubles guillemets pourraient provenir, vous pouvez essayer de les supprimer là avec quelque chose comme '$ {i.objectProps.NAME.replace (/ neededRegEx /," ")}'. Cela fonctionnerait si elles sont dans vos données, si la gelée les ajoute, alors cela pourrait être plus compliqué. 2) Je n'étais pas sûr que ça marche, mais cela semble être spécifique à 'serviceNow'. – Bricktop

+0

ok. Merci. Je vais l'essayer. ne peut pas offrir la prime jusqu'à ce qu'un jour se termine une fois qu'il commence. donc, offrira une fois que j'aurai le privilège. Un autre défi auquel je suis confronté est celui, en essayant de convertir le script 'index.jelly' en' index.groovy'. Mais dans la ligne 'st.include (it: build, page:" sidepanel.jelly ")', provoquant l'exception Null Pointer. Si vous le savez, pouvez-vous poster la version 'groovy' ci-dessus' index.jelly'? –