Jenkins的错误Pipeline将多个docker容器缠绕在黄瓜testing上,每个容器包含一个特征文件

尽pipe过去几个月来我们一直在使用piplelines,但我们一直坚持这个问题一周。 我们的目标是在我们的黄瓜testing套件中启动尽可能多的容器,并且同时运行这些testing(每个容器一个)。 以下是我们用下面的pipe道代码得到的错误:

java.lang.UnsupportedOperationException:调用公共静态java.util.List org.codehaus.groovy.runtime.DefaultGroovyMethods.each(java.util.List,groovy.lang.Closure)在CPS转换封闭尚不支持(JENKINS -26481); 封装在@NonCPS方法中,或使用Java风格的循环

pipe道代码:

def cucumberTestImage pipeline { agent any options { echo "options stuff" } stages { stage('Build & Deploy'){ steps { parallel ( SPA: { script { echo "deploying SPA app" } } } echo 'SPA JOB COMPLETED!!' }, Tests: { script { } //building docker image name cucumberTestImage } } ) } } stage('Test') { steps { script { def tests = [:] getFeatures().each {stage -> tests[stage] = { cucumberTestImage.inside{sh "echo ${stage}"} }} parallel tests; } } } } } @NonCPS def getFeatures() { return sh(script: 'cd testfolder && find features -type f -name \'*.feature\'', returnStdout: true).tokenize() } 

错误似乎表明这个块导致了这个问题:

 getFeatures().each {stage -> tests[stage] = { cucumberTestImage.inside{sh "echo ${stage}"} }} 

看来每个方法都不支持你正在使用的jenkins版本,你可以把它改成如下:

 def features = getFeatures() for(def stage: features) { tests[stage] = {cucumberTestImage.inside{sh "echo ${stage}"}}} } 

或者,您可能需要升级jenkins,因为jenkins问题JENKINS-26481已解决。

由于我原来的问题已经解决,我能够成功地运行jenkinspipe道两次,突然之间突然出现另一个问题,没有任何代码更改由我做..奇怪! 问题是dockerimage.inside块内的variables对所有并行运行保持相同的值。 我不知道为什么它发生..这是没有任何意义的。 下面的代码是有问题的!

 stage('Test') { steps { script { def tests = [:] def features = getFeatures() for(def stage: features) { tests[stage] = {cucumberTestImage.inside{ sh "echo running test --- ${stage}" //sh "cd /app && ./bin/cucumber ${stage}" }}} parallel tests; } } } def getFeatures() { return sh(script: 'cd frameworkfolder && find features -type f -name \'*.feature\'', returnStdout: true).tokenize() }