jenkins - 为什么 Jenkins 管道中的这种情况不起作用?
问题描述
我对以下管道代码感到生气,因为它没有达到我的预期。有谁知道我做错了什么?
这是我定义参数的管道代码
pipeline {
agent any
parameters { booleanParam(name: 'bForceCheckout', defaultValue: false, description: '') }
...
这里是舞台本身
stage('SVN Checkout') {
// Get code from SVN repository
steps {
script {
// If project is not yet checked out, setup checkout structure, i.e. which
// folders will be checked out and which will not be checked out
retry (5) {
try {
def svnInfoError = bat (returnStatus: true, script: "svn info ${projectName}")
// bForceCheckout has to be set as parameter in the job
println "---> " + ((svnInfoError != 0) || bForceCheckout)
if ((svnInfoError != 0) || bForceCheckout) {
println "svnInfoError: " + svnInfoError
println "bForceCheckout: " + bForceCheckout
timeout(activity: true, time: 90, unit: 'MINUTES') {
// Clean up
deleteDir ()
... some SVN related stuff ...
}
}
} catch (Exception ex) {
// Clean up
deleteDir ()
println(ex.toString());
error ("SVN checkout: directory structure could not be set up")
}
}
}
}
}
这是控制台输出。如您所见,svnInfoError和bForceCheckout为 0 / false,但 if 条件中的部分仍然被执行...
12:51:22
[Pipeline] echo
12:51:22 --->false
[Pipeline] echo
12:51:23 svnInfoError: 0
[Pipeline] echo
12:51:23 bForceCheckout: false
[Pipeline] timeout
12:51:23 Timeout set to expire after 1 hr 30 min without activity
[Pipeline] {
[Pipeline] deleteDir
[Pipeline] bat
12:55:21
解决方案
谢谢各位,原来是数据类型的问题。我现在还发现了导致相同答案的以下问题:booleanParam in jenkins dsl
如下定义参数仍然会给你一个字符串类型的变量。
parameters { booleanParam(name: 'bForceCheckout', defaultValue: false, description: '') }
检查数据类型:
println bForceCheckout.getClass()
...会给你
09:06:03 class java.lang.String
在我看来这是一个错误,所以我创建了一个 Jenkins 问题:https ://issues.jenkins-ci.org/browse/JENKINS-57499
现在我最终将上面的代码更改为以下代码(是的,我将进行一些重命名,因为变量不包含布尔值),现在它可以工作了:
if ((svnInfoError != 0) || bForceCheckout.toBoolean()) {
编辑:我发现实际上您应该使用以下语法来访问参数,这可以按预期工作:
if ((svnInfoError != 0) || params.bForceCheckout) {
推荐阅读
- javascript - Javascript 没有在 IE 中触发
- scala - Scala Spark PairRDD 映射无法推断类型
- python - 我需要在一个脚本中使用烧瓶循环或计划任务,或者在烧瓶脚本和循环脚本之间创建一些通信
- r - 如何使用 dplyr 过滤 R 中列的笛卡尔积的元素?
- vue.js - Webpack 生产浏览器重载
- android - 我们究竟应该如何在 Android 上为 Chrome 实现 Native App Install Prompt?
- typescript - TypeScript 确定类型单击处理程序将返回
- c# - 如何与单击按钮一起调用变量?
- python - 如何矢量化 pandas 操作以提高速度?
- c++ - 我在编译 http://www.opengl-tutorial.org/ 教程时遇到了麻烦