Как получить доступ к значениям параметров Jenkinsfile в виде строк в цикле

В нашем 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, но мне не удалось заставить что-либо работать. Похоже, это как-то связано с "связыванием", но я не знаком с этим.

2 ответа

Решение

params это GlobalVariable что при доступе возвращает неизменяемую карту. Вы можете увидеть реализацию здесь.

Потому что это возвращает Mapвы можете использовать те же стратегии для его итерации, что и для обычных Groovy-карт.

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

Более новые версии библиотек Groovy CPS должны обрабатывать большинство случаев итерации, поскольку JENKINS-26481 был разрешен.

Вы можете сделать это с помощью ключевого слова 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]
        }
    }
}

При появлении запроса будут выведены только значения (a,b,c), в которые вы вводите строку "true" для ввода

Другие вопросы по тегам