如果参数化构建参数存在与否,如何在 Jenkins Workflow 中检测?
How to detect in Jenkins Workflow if parameterized build parameter exists or not?
检测参数化构建中的参数是否存在的最佳方法是什么?
我找到的最接近的解决方案是在 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,还是有更好的方法?
当您处于沙盒模式(或通过 SCM)时,您不能使用 getBinding()。至少,这就是我到目前为止 运行 的目的。
到目前为止我使用的是以下方法,在工作流文件的顶部我插入以下内容:
properties([[$class: 'ParametersDefinitionProperty', parameterDefinitions: [[$class: 'StringParameterDefinition', defaultValue: 'default_value', description: '', name: 'your_parameter']]]])
这样您的参数将具有默认值,当它作为构建参数提供时将被覆盖。
您可以使用try-catch来检查参数是否存在:
try {
echo TEST1
echo 'TEST1 is defined'
} catch (err) {
echo 'TEST1 is not defined'
}
您可以在较新版本的 Jenkins 中使用 params
变量。
以下是我读取参数化构建的 PLATFORM
参数的方式。它是一个字符串参数。
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
我在上面写了"newer versions of Jenkins"。这是该教程中的定义:
As of workflow-cps version 2.18, a new params global variable provides sane access also on the first run (by returning specified default values).
当你使用 Pipelines 时,你可以访问对象: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"
}
检测参数化构建中的参数是否存在的最佳方法是什么? 我找到的最接近的解决方案是在 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,还是有更好的方法?
当您处于沙盒模式(或通过 SCM)时,您不能使用 getBinding()。至少,这就是我到目前为止 运行 的目的。
到目前为止我使用的是以下方法,在工作流文件的顶部我插入以下内容:
properties([[$class: 'ParametersDefinitionProperty', parameterDefinitions: [[$class: 'StringParameterDefinition', defaultValue: 'default_value', description: '', name: 'your_parameter']]]])
这样您的参数将具有默认值,当它作为构建参数提供时将被覆盖。
您可以使用try-catch来检查参数是否存在:
try {
echo TEST1
echo 'TEST1 is defined'
} catch (err) {
echo 'TEST1 is not defined'
}
您可以在较新版本的 Jenkins 中使用 params
变量。
以下是我读取参数化构建的 PLATFORM
参数的方式。它是一个字符串参数。
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
我在上面写了"newer versions of Jenkins"。这是该教程中的定义:
As of workflow-cps version 2.18, a new params global variable provides sane access also on the first run (by returning specified default values).
当你使用 Pipelines 时,你可以访问对象: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"
}