Как получить доступ к значениям параметров 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" для ввода