Jenkins Pipeline为黄瓜测试旋转多个docker容器时出错,每个容器一个特征文件

时间:2017-11-17 18:04:43

标签: docker jenkins cucumber jenkins-pipeline

我们一直坚持这个问题一个星期,尽管过去几个月我们一直在使用管道。我们的目标是在我们的黄瓜测试套件中旋转尽可能多的容器和并行运行这些测试(每个容器一个)。以下是我们通过以下管道代码获得的错误:

  

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

管道代码:

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

2 个答案:

答案 0 :(得分:0)

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

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 issue JENKINS-26481

答案 1 :(得分:0)

由于我的原始问题已经解决,并且我能够成功运行两次jenkins管道,突然之间另一个问题突然出现而我没有做任何代码更改......很奇怪!问题是dockerimage.inside块中的变量对于所有并行运行保持相同的值。我不知道为什么会这样......它没有任何意义。以下代码有问题!

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