Ich führe diesen Code über die Jenkins-Pipeline (gemeinsam genutzte Bibliothek) aus.
enum Components {
service('name_api')
Components(String componentName) {
this.componentName = componentName
}
private String componentName
String getComponentName() {
return componentName
}
static boolean isValid(String name) {
for (Components component : values()) {
if (component.getComponentName().equalsIgnoreCase(name)) {
return true
}
}
println("The name of component is incorrect")
}
}
Vor Ort funktioniert es. Ich erhalte diesen Fehler:
hudson.remoting.ProxyException:
com.cloudbees.groovy.cps.impl.CpsCallableInvocation
hilf mir bitte
Mit dem groovigen Interpreter in diesem Jenkins stimmt etwas nicht. Ich versuche eine Bibliothek zu schreiben und habe den gleichen Fehler.
Ich habe ein Beispiel für ein Pipeline-Skript erstellt. Ich habe verschiedene Klassen geschrieben, um induzierte Fehler zu vermeiden:
class Test1 {
private t1
private wfs
Test1(Test2 t2, wfs) {
this.wfs = wfs
wfs.echo 'TEST1 constructor'
this.t1 = t2.getT2() }
def getT1() {
wfs.echo 'getT1() function'
def result = t1.toString()
return result }
}
class Test2 {
private t2
private wfs
Test2(wfs) {
this.wfs = wfs
wfs.echo 'TEST2 constructor'
this.t2 = "hello" }
def getT2() {
wfs.echo 'getT2() function'
def result = t2.toString()
return result }
}
echo 'Creating Test2 object'
Test2 test2 = new Test2(this)
echo "Test2 object was created successfully. test2.t2="+test2.getT2()
echo 'Creating Test1 object'
Test1 test1 = new Test1(test2,this)
echo "Test1 object was created successfully. test1.t1="+test1.getT1()
ausgabe für dieses Skript ist:
Started by user admin
[Pipeline] echo
Creating Test2 object
[Pipeline] echo
TEST2 constructor
[Pipeline] echo
getT2() function
[Pipeline] echo
Test2 object was created successfully. test2.t2=hello
[Pipeline] echo
Creating Test1 object
[Pipeline] echo
TEST1 constructor
[Pipeline] End of Pipeline
com.cloudbees.groovy.cps.impl.CpsCallableInvocation
Finished: FAILURE
Das Problem liegt in dieser Zeichenfolge this.t1 = t2.getT2()
. Es stellt sich heraus, dass die Funktion t2.getT2()
nicht im Konstruktor ausgeführt werden konnte :(
Und der zweite - wenn Sie versuchen, so zurückzukehren:
def getT1() {
wfs.echo 'getT1()'
return t1.toString()
}
Es wird scheitern ...
Da dies eng verwandt ist und in Google oben angezeigt wird, werde ich einige zusätzliche Informationen zu com.cloudbees.groovy.cps.impl.CpsCallableInvocation
bereitstellen.
Ich komme hierüber vorbei, wenn ich folgenden Konstruktor verwendet habe: (lokal keine Fehler in EclipseIDE, aber Jenkins beschwerte sich mit dieser nutzlosen Fehlermeldung, die keine Codezeile erwähnte)
class blubb{
blubb(Name){
super(Name) // must be first in CONSTRUCTOR
// no return from super! , nevertheless, last throws...
println("This will never be printed inside of jenkins!")
someBaseClassFunction() // this line is not allowed but errors!
}
}
Dies ist der Punkt, an dem @wunt kleiner, aber sehr nützlicher Kommentar ins Spiel kommt.
Wenn ich auf diesen Fehler stoße, kommentiere ich die Methode, die mit @NonCPS
aus der groovy-cps-Bibliothek von Cloudbees fehlschlägt und wurde gelöst!