首页 > 解决方案 > 为什么 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")
            }
         }
      }
   }
}

这是控制台输出。如您所见,svnInfoErrorbForceCheckout为 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  

标签: jenkinsgroovyjenkins-pipeline

解决方案


谢谢各位,原来是数据类型的问题。我现在还发现了导致相同答案的以下问题: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) {

推荐阅读