Valore restituito dalla funzione bat in Groovy DSL Pipeline in Jenkins
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
- Accetta un
AWARD_YEARparametro - Controlla un progetto da SVN
- Esegue il
kitchenprogramma tramite unabat()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
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.