7 votes

erreur de bibliothèque partagée jenkins com.cloudbees.groovy.cps.impl.CpsCallableInvocation

J'exécute ce code à travers le pipeline de Jenkins (bibliothèque partagée).

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

Cela fonctionne localement, mais dans le pipeline Jenkins, j'obtiens cette erreur :

hudson.remoting.ProxyException:         
com.cloudbees.groovy.cps.impl.CpsCallableInvocation

Aidez-moi, s'il vous plaît

4voto

wunt Points 41

Quelque chose ne va pas avec l'interpréteur groovy dans ce Jenkins. J'essaie d'écrire une bibliothèque et j'ai la même erreur.

J'ai fait un exemple de pipeline script. J'ai écrit différentes classes pour éviter les erreurs induites :

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()

La sortie sur ce script est :

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

Le problème se trouve dans cette chaîne this.t1 = t2.getT2() . Il s'avère que t2.getT2() La fonction ne peut pas être réalisée dans le constructeur :(

Et le deuxième - si vous essayez de retourner comme ça :

def getT1() {
    wfs.echo 'getT1()' 
    return t1.toString() 
}

Il échouera...

0voto

Cutton Eye Points 354

Comme ce sujet est étroitement lié et qu'il apparaît en tête de liste dans Google, je vais vous fournir des informations supplémentaires. com.cloudbees.groovy.cps.impl.CpsCallableInvocation

Je suis tombé sur ce problème lorsque j'ai utilisé le constructeur suivant : (aucune erreur localement dans EclipseIDE, mais jenkins s'est plaint avec ce message d'erreur inutile ne mentionnant aucune ligne de code)

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

C'est ici que le commentaire de @wunt, petit mais très utile, entre en jeu.

0voto

Arcones Points 396

Lorsque je suis confronté à cette erreur, j'annote la méthode qui échoue avec @NonCPS de Bibliothèque groovy-cps de Cloudbees et résolu !

0voto

Marv Points 2220

J'ai eu le même problème. Dans mon cas, il a été causé par un appel de méthode pour le paramètre d'un constructeur pour un champ, où l'appel de méthode dépendait d'un champ qui n'était initialisé que dans le constructeur. Quelque chose comme ceci :

class A {
    final def b = new B(method())

    final def param

    A(param) {
        this.param = param
    }

    def method() {
        return param.foo()
    }
}

J'ai déplacé l'initialisation dans le constructeur et j'ai intégré la méthode et le problème a disparu :

class A {
    final def b

    final def param

    A(param) {
        this.param = param
        this.b = new B(param.foo())
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X