Valore restituito dalla funzione bat in Groovy DSL Pipeline in Jenkins

Aug 25 2020

sfondo

Ho scritto uno script di pipeline dichiarativo di Groovy DSL in Jenkins. Lo script viene eseguito su un agente slave che viene eseguito su Windows Server 2012. Su questa macchina dell'agente è presente un eseguibile della riga di comando chiamato kitchen. Eseguo il kitchenprogramma usando il bat()metodo di Groovy e inserisco un parametro che viene passato nella pipeline quando viene costruito.

Lo script è semplice e svolge le seguenti operazioni in una serie di due fasi

  1. Accetta un AWARD_YEARparametro
  2. Controlla un progetto da SVN
  3. Esegue il kitchenprogramma tramite una bat()funzione

Sto usando Jenkins 2.235.3

Problema

L' kitcheneseguibile restituisce un codice di uscita compreso tra 0 e 9. Quando il codice di uscita è diverso da 0, ciò indica che l'eseguibile non è riuscito. Tuttavia, allo stato attuale, l'esecuzione della pipeline riesce sempre indipendentemente dal codice di uscita. Per risolvere questo problema, devo memorizzare il codice di uscita in una variabile e quindi controllarne il valore.

Tuttavia, quando provo a memorizzare il risultato in una variabile ottengo l'errore mostrato di seguito.

Codice ed errore

Di seguito è riportato il codice che causa l'errore

pipeline {
    agent { label 'pentaho-test' }


    parameters {
        string(name: 'AWARD_YEAR', defaultValue: "${Calendar.getInstance().get(Calendar.YEAR)}", description: 'Award Year Parameter') } stages { stage('Checkout') { steps { checkout changelog: false, poll: false, scm: [ $class: 'SubversionSCM', 
                        additionalCredentials: [], 
                        excludedCommitMessages: '', 
                        excludedRegions: '', 
                        excludedRevprop: '', 
                        excludedUsers: '', 
                        filterChangelog: false, 
                        ignoreDirPropChanges: false, 
                        includedRegions: '', 
                        locations: [[cancelProcessOnExternalsFail: true, 
                            credentialsId: 'hudson', 
                            depthOption: 'infinity', 
                            ignoreExternalsOption: true, 
                            local: '.', 
                            remote: 'https://svn.int.domain.edu/project/trunk']], 
                        quietOperation: true, 
                        workspaceUpdater: [$class: 'UpdateUpdater']
                ]
            }
        }
        stage('Run Kitchen') {       
            steps {
                def result = bat( label: '', returnStdout: true, script: 'kitchen -args %AWARD_YEAR%'  )
                
                echo result     
            }

        }

    }

}

Di seguito è riportato l'errore mostrato nella console Jenkins

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 35: Expected a step @ line 35, column 5.
                result = bat( label: '', returnStdout: true, script: 'kitchen -args %AWARD_YEAR%'  )
       ^

1 error

    at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
    at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1085)
    at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:603)
    at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:581)
    at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:558)
    at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
    at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
    at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
    at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
    at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.doParse(CpsGroovyShell.java:142)
    at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:127)
    at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:561)
    at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:522)
    at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:337)
    at hudson.model.ResourceController.execute(ResourceController.java:97)
    at hudson.model.Executor.run(Executor.java:428)
Finished: FAILURE

Quando modifico il passaggio come segue lo script viene eseguito senza errori, ma il codice di uscita non viene memorizzato e quindi anche quando l'eseguibile binario fallisce la pipeline mostra come se avesse successo.

steps {
     result = bat label: '', returnStdout: true, script: 'kitchen -args %AWARD_YEAR%'  
}

Post Script

Ci sono altre due domande StackOverflow che pongono questa domanda specifica, ma la soluzione causa l'errore che sto ricevendo.

Risposte

1 SzymonStepniak Aug 24 2020 at 23:14

Se vuoi catturare il risultato del shpassaggio e assegnarlo a una variabile, devi farlo nel scriptblocco.

Modificare

stage('Run Kitchen') {       
    steps {
        def result = bat( label: '', returnStdout: true, script: 'kitchen -args %AWARD_YEAR%'  )
                
        echo result     
    }
}

per

stage('Run Kitchen') {       
    steps {
        script {
            def result = bat( label: '', returnStdout: true, script: 'kitchen -args %AWARD_YEAR%'  )
                
            echo result     
        }
    }
 }

e dovresti risolvere il problema che vedi al momento.