2016-04-14 21 views
5

Ho bisogno di analizzare alcuni JSON in una pipeline Jenkins e chiamare alcuni metodi regolari in un ciclo, tuttavia lo script esce sempre dopo la prima chiamata di funzione. Come fare questo?Jenkins Groovy come chiamare metodi dal metodo @NonCPS senza terminare la pipeline

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

Nell'esempio precedente, anche con un oggetto JSON come:

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

... conduttura esce sempre dopo la prima iterazione. Ciò è presumibilmente dovuto al mixaggio di funzioni di sincronizzazione e asincrone. C'è un modo per fare questo?

+0

Avete notato l'errore di battitura: def jsonObject = jsonSurper (json) (manca "l" nella parte destra)? – izzekil

+0

È solo un errore di battitura nel post, non lo script vero ... Ma buon occhio @izzekil –

+1

Si potrebbe aver affrontato questo: https://issues.jenkins-ci.org/browse/JENKINS-31314 o questo: https: //issues.jenkins-ci.org/browse/JENKINS-26481 – izzekil

risposta

7

ho risolto questo problema essenzialmente nel modo seguente:

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

distruggere immediatamente l'istanza JsonSlurper dopo che è utilizzato, rimuovere @NonCPS annotazione, passare a un c-style per il ciclo al posto di ciascuno.

+0

forse hai anche un'idea su come risolvere questo https://stackoverflow.com/questions/44629038/how-do-i-remove-a-temporary-folder-on-exit-in-groovy - cosa dovremmo fare a questo per farlo funzionare in Jenkins? – sorin

2

Giusto per chiarire, questo è documentato come una caratteristica non supportata - https://github.com/jenkinsci/workflow-cps-plugin/#technical-design

Tu non puoi chiamare regolari (CPS-trasformato) metodi, o Pipeline passi, da un metodo @NonCPS, in modo che siano i più utilizzati per eseguire alcuni calcoli prima di passare un riassunto allo script principale.