2016-04-14 3 views
5

Ich muss einige JSON in einer Jenkins-Pipeline analysieren und einige reguläre Methoden in einer Schleife aufrufen, jedoch das Skript immer nach dem ersten Funktionsaufruf beendet. Wie macht man das?Jenkins Groovy wie Methoden von @NonCPS-Methode ohne Ende der Pipeline aufgerufen werden

import groovy.json.JsonSlurper 
import com.cloudbees.groovy.cps.NonCPS 

@NonCPS 
def myMethod(String json) { 
    def jsonSlurper = new JsonSlurper() 
    def jsonObject = jsonSlurper(json) 
    jsonObject.each { 
     obj -> 
      switch(obj.name) { 
       case "foo": 
        doAThing(obj) 
        break 
       case "bar": 
        doAnotherThing(obj) 
        break 
      } 
    } 
} 

Im obigen Beispiel, sogar mit einem JSON-Objekt wie:

[{ 
    "name": "foo" 
}, { 
    "name": "bar" 
}] 

... die Pipeline nach der ersten Iteration immer verläßt. Dies ist vermutlich auf das Mischen von Sync- und Async-Funktionen zurückzuführen. Gibt es eine Möglichkeit, dies zu tun?

+0

Haben Sie den Tippfehler bemerkt: def jsonObject = jsonSurper (json) (fehlende "l" im rechten Teil)? – izzekil

+0

Es ist nur ein Tippfehler in der Post, nicht das eigentliche Skript ... Aber gutes Auge @izzekil –

+1

Sie könnten dies konfrontiert haben: https://issues.jenkins-ci.org/browse/JENKINS-31314 oder das: https: //issues.jenkins-ci.org/browse/JENKINS-26481 – izzekil

Antwort

7

ich dieses Problem behoben haben im wesentlichen durch folgende Maßnahmen:

import groovy.json.JsonSlurper 

def myMethod(String json) { 
    def jsonSlurper = new JsonSlurper() 
    def jsonObject = jsonSlurper(json) 
    jsonSlurper = null 
    for(int i = 0; i < jsonObject.size(); i++) { 
     switch(jsonObject[i].name) { 
      case "foo": 
       doAThing(jsonObject[i]) 
       break 
      case "bar": 
       doAnotherThing(jsonObject[i]) 
       break 
     } 
    } 
} 

sofort die JsonSlurper Instanz zerstören, nachdem es verwendet wird, @NonCPS Anmerkung, Umstellung auf eine c-style for-Schleife statt jeder entfernen.

+0

vielleicht haben Sie auch eine Idee, wie Sie dieses https://stackoverflow.com/questions/44629038/how-do-i-remove-a-temporary-folder-on-exit-in-groovy lösen - was sollen wir Tun Sie das, damit es in Jenkins funktioniert? – sorin

2

Nur um zu klären, dies als ein nicht unterstütztes Feature dokumentiert - https://github.com/jenkinsci/workflow-cps-plugin/#technical-design

Sie nicht regelmäßig anrufen können (CPS-transformierten) Verfahren oder Pipeline Schritte, von einem @NonCPS Verfahren, so dass sie am besten verwendet, um einige Berechnungen durchzuführen, bevor eine Zusammenfassung an das Hauptscript zurückgegeben wird.

Verwandte Themen