2

在我们的 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 上进行了实验,但没有成功。看起来它与“绑定”有关,但我对此并不熟悉。

4

2 回答 2

5

params是一个GlobalVariable在访问时返回一个不可修改的映射。您可以在此处查看实现。

因为它返回 a Map,所以您可以使用与常规 Groovy 映射相同的策略对其进行迭代。

params.each { key, value ->
  // do things
}
for (entry in params) {
  // entry.key or entry.value
}

自从解决了JENKINS-26481以来,较新版本的 Groovy CPS 库应该可以处理大多数迭代情况。

于 2018-04-05T14:09:49.263 回答
1

您可以使用 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)

于 2018-04-05T10:45:34.790 回答