2016-04-14 38 views
5

Potrzebuję parsować niektóre JSON w potoku Jenkinsa i wywołać pewne regularne metody w pętli, jednak skrypt zawsze kończy działanie po pierwszym wywołaniu funkcji. Jak to zrobić?Jenkins Groovy jak wywoływać metody z metody @NonCPS bez kończącego się potoku

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

W powyższym przykładzie, nawet obiekt JSON jak:

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

... rurociąg zawsze wychodzi po pierwszej iteracji. Prawdopodobnie wynika to z mieszania funkcji synchronizacji i asynchronizacji. Czy jest jakiś sposób to zrobić?

+0

Czy zauważyłeś literówkę: def jsonObject = jsonSurper (json) (brak "l" w prawej części)? – izzekil

+0

To tylko literówka w poście, a nie faktyczny scenariusz ... Ale dobre oko @izzekil –

+1

Mogłeś mieć do czynienia z tym: https://issues.jenkins-ci.org/browse/JENKINS-31314 lub to: https: //issues.jenkins-ci.org/browse/JENKINS-26481 – izzekil

Odpowiedz

7

mam rozwiązany ten problem przede wszystkim w następujący sposób:

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

natychmiast zniszczyć instancji JsonSlurper po to używany, usuń @NonCPS adnotacji, przełącznik do stylu C do pętli zamiast siebie.

+0

może masz również pomysł, jak rozwiązać ten https://stackoverflow.com/questions/44629038/how-do-i-remove-a-temporary-folder-on-exit-in-groovy - co powinniśmy zrobić to, aby działało w Jenkins? – sorin

2

Wystarczy, aby wyjaśnić, jak to jest udokumentowane nieobsługiwanym cechę - https://github.com/jenkinsci/workflow-cps-plugin/#technical-design

Nie można nazwać regularne (CPS przekształconych) metody, lub rurociągu kroków od sposobu @NonCPS, więc są one najlepiej stosować za wykonanie pewnych obliczeń przed przekazaniem podsumowania z powrotem do głównego skryptu.