ゴール
Jenkins Pipelineがjava.lang.UnsupportedOperationExceptionでこけた。
どうやら、タプルを使用したことが原因らしい。
https://issues.jenkins-ci.org/browse/JENKINS-38846
このエラーを解消する。
やりかた
タプルなしの実装に変える。
Before
Jenkinsfile
def tupleFunc() {
["a","b"]
}
node {
(tA, tB) = tupleFunc()
echo "tA: $tA"
echo "tb: $tB"
}
コンソール出力
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
General error during canonicalization: java.lang.UnsupportedOperationException
java.lang.UnsupportedOperationException
at com.cloudbees.groovy.cps.CpsTransformer.visitTupleExpression(CpsTransformer.java:858)
at org.codehaus.groovy.ast.expr.TupleExpression.visit(TupleExpression.java:78)
at com.cloudbees.groovy.cps.CpsTransformer.visit(CpsTransformer.java:335)
:
省略
:
Finished: FAILURE
After
Jenkinsfile
def tupleFunc() {
["a","b"]
}
node {
result = tupleFunc()
def tA = result[0]
def tB = result[1]
echo "tA: $tA"
echo "tb: $tB"
}
コンソール出力
[Pipeline] {
[Pipeline] echo
tA: a
[Pipeline] echo
tb: b
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
考察
Jenkins 2.60.3 でこのエラーになったが、2.70 では発生しなかった。特定のプラグインのバージョンにバグがあるのかも。
UnsupportedOperationExceptionはタプルへの再代入時に発生するので、そういう動きが旧バージョンのJenkinsに入っていたのかなぁ。
tuple.groovy
def tuple = new Tuple('apple','banana')
println "tuple[0]: ${tuple[0]}"
println "tuple[1]: ${tuple[1]}"
tuple[0] = 'coke' // -> UnsupportedOperationException
実行結果
tuple[0]: apple
tuple[1]: banana
Caught: java.lang.UnsupportedOperationException
java.lang.UnsupportedOperationException
at tuple.run(tuple.groovy:6)