如果参数化构建参数存在与否,如何在Jenkins工作流中检测?

时间:2016-01-06 00:26:00

标签: jenkins jenkins-workflow

我可以检测参数化构建中的参数是否存在的最佳方法是什么? 我找到的最接近的解决方案是在groovy中执行此操作:

node {
   groovy.lang.Binding myBinding = getBinding()
   boolean mybool = myBinding.hasVariable("STRING_PARAM1")
   echo mybool.toString()
   if (mybool) {
       echo STRING_PARAM1
       echo getProperty("STRING_PARAM1")
   } else {
       echo "STRING_PARAM1 is not defined"
   }

   mybool = myBinding.hasVariable("DID_NOT_DEFINE_THIS")
   if (mybool) {
       echo DID_NOT_DEFINE_THIS
       echo getProperty("DID_NOT_DEFINE_THIS")
   } else {
       echo "DID_NOT_DEFINE_THIS is not defined"
   }
}

使用getBinding()是否有合适的API来执行此操作,还是有更好的方法?

4 个答案:

答案 0 :(得分:5)

您可以使用try-catch检查是否存在参数:

try {
    echo TEST1
    echo 'TEST1 is defined'
} catch (err) {
    echo 'TEST1 is not defined'
}

答案 1 :(得分:3)

当您处于沙盒模式(或通过SCM)时,您不允许使用getBinding()。至少,这是我到目前为止遇到的情况。

我目前使用的是以下方法,在工作流文件中,在顶部插入以下内容:

properties([[$class: 'ParametersDefinitionProperty', parameterDefinitions: [[$class: 'StringParameterDefinition', defaultValue: 'default_value', description: '', name: 'your_parameter']]]])

这样你的参数将有一个默认值,当它作为构建参数提供时将被覆盖。

答案 2 :(得分:2)

使用管道时,您可以访问以下对象:params whichs是Java映射,然后可以使用:containsKey方法,即:

if(params.containsKey("STRING_PARAM1")) {
   echo "STRING_PARAM1 exists as parameter with value ${STRING_PARAM1}"
} else {
   echo "STRING_PARAM1 is not defined"
}

答案 3 :(得分:1)

您可以在较新版本的Jenkins中使用params变量。

以下是我如何阅读参数化构建的PLATFORM参数。它是一个String参数。

def platform = params?.PLATFORM?.trim()

stage("checkPlatform") {
  if (platform) {
    echo "Going to build for platform: ${platform}"
    // ...
  } else {
    echo "No platform given. Cancelling build"
    error("No platform given")
  }
}
stage("..."){
    ///...
}

这里有一个教程:https://st-g.de/2016/12/parametrized-jenkins-pipelines

我写了#34;更新版本的Jenkins"以上。以下是该教程的定义:

  

从workflow-cps版本2.18开始,新的params全局变量也在第一次运行时提供了理智的访问(通过返回指定的默认值)。