2017-11-17 1 views
0

Wir sind seit einer Woche mit diesem Problem beschäftigt, obwohl wir seit einigen Monaten mit Pipelines arbeiten. Unser Ziel ist es, so viele Container wie viele Feature-Dateien in unserer Gurken-Testsuite hochzufahren und diese Tests parallel durchzuführen (eine pro Container). Hier ist der Fehler, den wir mit dem Pipeline-Code erhalten unter:Fehler bei der Jenkins-Pipeline, die mehrere Docker-Container für Gurkentests aufbaut, eine Feature-Datei pro Container

java.lang.UnsupportedOperationException: Aufruf public static java.util.List org.codehaus.groovy.runtime.DefaultGroovyMethods.each (java.util .List, groovy.lang.Closure) auf einem CPS-transformierten Verschluss wird noch nicht unterstützt (JENKINS-26481); Einkapseln in einem @NonCPS Verfahren oder Benutzung Java-style-Schleife

Pipeline-Code:

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

Antwort

0

die Fehler anzuzeigen scheinen, dass dieser Block das Problem verursacht:

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

Es scheint, dass jede Methode in der von Ihnen verwendeten jenkins-Version nicht unterstützt wird. Sie können sie wie folgt ändern:

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

Alternativ können Sie Jenkins aktualisieren, wie die angegebenen jenkins issue JENKINS-26481 aufgelöst ist.

+0

Danke für die schnelle Antwort. Es hat den Fehler behoben, aber der Stufenwert innerhalb des Image.Inside-Blocks behält den endgültigen Wert aus der Liste. Wenn also die parallele Anweisung in der Ausgabe startet, werden alle Echoanweisungen mit dem endgültigen Wert aus der Liste angezeigt! Das scheint ein spezifisches Problem zu sein. – Ram

+0

@Ram Ich glaube nicht, dass das Problem docker bezogen ist. Dies ist ein Problem der jenkins-Pipeline. Vielleicht möchten Sie https://stackoverflow.com/questions/40195720/how-to-print-each-element-of-multi-line-string-parameter eine Einstellung geben. Versuchen Sie auch, die Pipeline-Sandbox zu deaktivieren. – yamenk

+0

das ist gelöst, es gab einen Tippfehler – Ram

0

Da mein ursprüngliches Problem gelöst wurde und ich die jenkins-Pipeline zweimal erfolgreich ausführen konnte, tauchte plötzlich das andere Problem auf, ohne dass Codeänderungen von mir vorgenommen wurden. Das Problem ist, dass die Variable im Block dockerimage.inside den gleichen Wert für alle parallelen Läufe enthält. .Ich weiß nicht, warum es passiert .. es ergibt keinen Sinn. Der folgende Code ist in Frage!

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