如何在循环中以字符串形式访问 Jenkinsfile 参数值
How to access Jenkinsfile parameters values as strings in a loop
在我们的 Jenkinsfile 中,我们有很多参数(参数化构建),在这种情况下,我想检查每个参数是否已切换并对其进行操作。这些参数具有相似的名称,但以不同的小数结尾,因此我想遍历它们以实现此目的。
我有类似的东西:
if ("${TEST_00}" == "true") { testTasksToRun.add(testsList[0]) }
if ("${TEST_01}" == "true") { testTasksToRun.add(testsList[1]) }
if ("${TEST_02}" == "true") { testTasksToRun.add(testsList[2]) }
if ("${TEST_03}" == "true") { testTasksToRun.add(testsList[3]) }
if ("${TEST_04}" == "true") { testTasksToRun.add(testsList[4]) }
if ("${TEST_05}" == "true") { testTasksToRun.add(testsList[5]) }
但我想要这样的东西:
for(int i=0; i<testsList.size(); i++) {
if ("${TEST_0${i}}" == "true") {
testTasksToRun.add(testsList[i])
}
}
我试图搜索解决方案并在 GroovyConsole 上进行试验,但没有成功。貌似跟"binding"有点关系,不过我不熟。
您可以使用 this 关键字并引用当前作用域的属性来执行此操作。下面的示例代码在 Groovy 控制台中运行(因为这是一个脚本,@Field 注释是必需的,用于范围界定)
import groovy.transform.Field
def testsList = ['a','b','c']
@Field
def TEST_00 = "true"
@Field
def TEST_01 = "false"
@Field
def TEST_02 = "true"
for(int i=0; i<testsList.size(); i++) {
if ( this."TEST_0${i}" == "true") {
println testsList[i]
}
}
在 Jenkins 管道脚本中,您可以执行以下操作:
node {
def testsList = ['a','b','c']
def myInput = input message: 'Give me input 1', parameters: [string(defaultValue: '', description: '', name: 'DEMO1'), string(defaultValue: '', description: '', name: 'DEMO2'), string(defaultValue: '', description: '', name: 'DEMO3')]
for(int i=0; i<testsList.size(); i++) {
if ( myInput."DEMO${i+1}" == "true") {
println testsList[i]
}
}
}
出现提示时,它将仅输出您将字符串 "true" 提供给输入
的值 (a,b,c)
params
是一个 GlobalVariable
,访问时 returns 是一个不可修改的映射。可以看到实现here.
因为它 returns 一个 Map
,您可以使用与普通 Groovy 映射相同的策略对其进行迭代。
params.each { key, value ->
// do things
}
for (entry in params) {
// entry.key or entry.value
}
较新版本的 Groovy CPS 库应该可以处理大多数迭代情况,因为 JENKINS-26481 已得到解决。
在我们的 Jenkinsfile 中,我们有很多参数(参数化构建),在这种情况下,我想检查每个参数是否已切换并对其进行操作。这些参数具有相似的名称,但以不同的小数结尾,因此我想遍历它们以实现此目的。
我有类似的东西:
if ("${TEST_00}" == "true") { testTasksToRun.add(testsList[0]) }
if ("${TEST_01}" == "true") { testTasksToRun.add(testsList[1]) }
if ("${TEST_02}" == "true") { testTasksToRun.add(testsList[2]) }
if ("${TEST_03}" == "true") { testTasksToRun.add(testsList[3]) }
if ("${TEST_04}" == "true") { testTasksToRun.add(testsList[4]) }
if ("${TEST_05}" == "true") { testTasksToRun.add(testsList[5]) }
但我想要这样的东西:
for(int i=0; i<testsList.size(); i++) {
if ("${TEST_0${i}}" == "true") {
testTasksToRun.add(testsList[i])
}
}
我试图搜索解决方案并在 GroovyConsole 上进行试验,但没有成功。貌似跟"binding"有点关系,不过我不熟。
您可以使用 this 关键字并引用当前作用域的属性来执行此操作。下面的示例代码在 Groovy 控制台中运行(因为这是一个脚本,@Field 注释是必需的,用于范围界定)
import groovy.transform.Field
def testsList = ['a','b','c']
@Field
def TEST_00 = "true"
@Field
def TEST_01 = "false"
@Field
def TEST_02 = "true"
for(int i=0; i<testsList.size(); i++) {
if ( this."TEST_0${i}" == "true") {
println testsList[i]
}
}
在 Jenkins 管道脚本中,您可以执行以下操作:
node {
def testsList = ['a','b','c']
def myInput = input message: 'Give me input 1', parameters: [string(defaultValue: '', description: '', name: 'DEMO1'), string(defaultValue: '', description: '', name: 'DEMO2'), string(defaultValue: '', description: '', name: 'DEMO3')]
for(int i=0; i<testsList.size(); i++) {
if ( myInput."DEMO${i+1}" == "true") {
println testsList[i]
}
}
}
出现提示时,它将仅输出您将字符串 "true" 提供给输入
的值 (a,b,c)params
是一个 GlobalVariable
,访问时 returns 是一个不可修改的映射。可以看到实现here.
因为它 returns 一个 Map
,您可以使用与普通 Groovy 映射相同的策略对其进行迭代。
params.each { key, value ->
// do things
}
for (entry in params) {
// entry.key or entry.value
}
较新版本的 Groovy CPS 库应该可以处理大多数迭代情况,因为 JENKINS-26481 已得到解决。