如何解决Jenkins的Groovy DSL Pipeline中的bat函数返回值
背景
我在Jenkins中编写了Groovy DSL声明性管道脚本。该脚本在Windows Server 2012上运行的从属代理上执行。在此代理计算机上,有一个名为kitchen
的命令行可执行文件。我使用Groovy的kitchen
方法执行bat()
程序,并输入一个在构建时传递到管道中的参数。
该脚本很简单,并且分两个阶段进行以下操作
- 采用
AWARD_YEAR
参数 - 从SVN签出项目
- 通过
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问题问这个特定问题,但是解决方案导致我收到错误。
解决方法
如果要捕获sh
步骤的结果并将其分配给变量,则需要在script
块中完成。
更改
stage('Run Kitchen') {
steps {
def result = bat( label: '',returnStdout: true,script: 'kitchen -args %AWARD_YEAR%' )
echo result
}
}
到
stage('Run Kitchen') {
steps {
script {
def result = bat( label: '',script: 'kitchen -args %AWARD_YEAR%' )
echo result
}
}
}
,您应该解决当前遇到的问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。