Jenkins的Groovy DSL Pipeline中的bat函数返回值

问题描述

背景

我在Jenkins中编写了Groovy DSL声明性管道脚本。该脚本在Windows Server 2012上运行的从属代理上执行。在此代理计算机上,有一个名为kitchen的命令行可执行文件。我使用Groovy的kitchen方法执行bat()程序,并输入一个在构建时传递到管道中的参数。

该脚本很简单,并且分两个阶段进行以下操作

  1. 采用AWARD_YEAR参数
  2. 从SVN签出项目
  3. 通过kitchen函数执行bat()程序

我正在使用 Jenkins 2.235.3

问题

kitchen可执行文件返回范围为0-9的退出代码。当退出代码不是0时,表示可执行文件已失败。但是,就目前情况而言,无论退出代码如何,流水线执行总是成功的。要解决此问题,我需要将退出代码存储在变量中,然后检查其值。

但是,当我尝试将结果存储到变量中时,出现以下错误。

代码和错误

下面是导致错误的代码

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     
            }

        }

    }

}

以下是Jenkins控制台中显示的错误

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 35: Expected a step @ line 35,column 5.
                result = bat( label: '',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

当我按照以下步骤修改步骤时,脚本会无错误执行,但是不会存储退出代码,因此即使二进制可执行文件失败,流水线也会显示为成功。

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

发布脚本

还有另外两个StackOverflow问题问这个特定问题,但是解决方案导致我收到错误。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)