このコードはjenkinsパイプライン(共有ライブラリ)を介して実行します。
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")
}
}
ローカルで動作しますが、Jenkinsパイプラインで次のエラーが発生します。
hudson.remoting.ProxyException:
com.cloudbees.groovy.cps.impl.CpsCallableInvocation
お願い助けて
そのジェンキンスのグルービーなインタープリターに何か問題があります。ライブラリを作成しようとしていますが、同じエラーが発生します。
パイプラインスクリプトの例を作りました。引き起こされるエラーを回避するために、さまざまなクラスを作成しました。
_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()
_
このスクリプトの出力は次のとおりです。
_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
_
問題はこの文字列this.t1 = t2.getT2()
にあります。 t2.getT2()
関数はコンストラクタ内で実行できなかったことがわかりました:(
そして、2番目のもの-あなたがこのように戻ることを試みた場合:
_def getT1() {
wfs.echo 'getT1()'
return t1.toString()
}
_
失敗します...
これは密接に関連していて、上部のgoogleにポップアップ表示されるので、com.cloudbees.groovy.cps.impl.CpsCallableInvocation
にいくつかの追加情報を提供します
私は次のコンストラクタを使用したときにこれを見つけました:(EclipseIDEでローカルにエラーはありませんが、jenkinsはコード行について言及していないこの役に立たないエラーメッセージで不平を言いました)
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!
}
}
ここで、@ wuntの小さいながらも非常に便利なコメントが出てきます。
同じ問題がありました。私の場合は、フィールドのコンストラクターのパラメーターのメソッド呼び出しが原因でした。メソッド呼び出しは、コンストラクターでのみ初期化されたフィールドに依存していました。このようなもの:
class A {
final def b = new B(method())
final def param
A(param) {
this.param = param
}
def method() {
return param.foo()
}
}
初期化をコンストラクターに移動し、メソッドをインライン化したため、問題は解決しました。
class A {
final def b
final def param
A(param) {
this.param = param
this.b = new B(param.foo())
}
}
このエラーが発生した場合、失敗しているメソッドに@NonCPS
from CloudbeesによるGroovy-cpsライブラリ と解決しました!