Я пытаюсь использовать несколько collectEntries
последовательно в моем сценарии Groovy. Лучше посмотреть код, сейчас у меня есть:
stage('Test') {
// Reading content of the file
def portsFileContent = readFile 'UsedPorts.txt'
// Split the file by next line
def ports = portsFileContent.split('\n')
def steps = ports.collectEntries { port ->
["UI Test on port $port", {
sh "#!/bin/bash -lx \n startServerWithDifferentPort --params=port=$port"
}]
}
parallel steps
}
В файле "UsedPorts.txt" разные порты разделены разрывом строки, например:
4723
4733
4743
Таким образом, эти числа сохраняются в переменной ports
, и эта переменная затем используется для запуска экземпляра сервера для каждого порта. Таким образом, в этом случае он запустит 3 разных экземпляра сервера с помощью этой команды:
def steps = ports.collectEntries { port ->
["UI Test on port $port", {
sh "#!/bin/bash -lx \n startServerWithDifferentPort --params=port=$port"
}]
}
parallel steps
Из-за parallel steps
в нем запускаются 3 экземпляра сервера одновременно с разными портами.
Работает нормально, но у меня есть другой файл, и мне нужно сделать то же самое снова. Итак, в моем втором файле есть такие записи, как:
name1
name2
name3
Я снова создал переменную, в которой храню свои 3 записи:
def anotherFile = readFile 'Names.txt'
def names = anotherFile.split('\n')
Вот что я пробовал:
stage('Test') {
// Reading content of the file
def portsFileContent = readFile 'UsedPorts.txt'
// Split the file by next line
def ports = portsFileContent.split('\n')
// Do the same again
def anotherFile = readFile 'Names.txt'
def names = anotherFile.split('\n')
def steps = ports.collectEntries, names.collectEntries { port, name ->
["UI Test on $name", {
sh "#!/bin/bash -lx \n someMoreShellStuff --params=port=$port"
}]
}
parallel steps
}
Но я не могу разделить свой второй collectEntries
запятой, потому что это дает мне синтаксическую ошибку. И теперь моя проблема в том, как я могу использовать эту переменную в одной команде. Это вообще возможно?
Спасибо
Обновление №1
После использования ответа Шимона Степняка мой новый код выглядит так:
stage('Test') {
// Reading content of the file
def portsFileContent = readFile 'AppiumUsedPorts.txt'
// Split the file by next line
def ports = portsFileContent.split('\n')
// Getting device IDs to get properties of device
def deviceIDFileContent = readFile 'DeviceIDs.txt'
def deviceIDs = deviceIDFileContent.split('\n')
// Define port and id as an pair
def pairs = (0..Math.min(ports.size(), deviceIDs.size())).collect { i -> [id: deviceIDs[i], port: ports[i]] }
def steps = pairs.collectEntries { pair ->
["UI Test on ${pair.id}", {
sh "echo 'Running test with port ${pair.port}'"
}]
}
parallel steps
}
Это вызывает ошибку java.lang.ArrayIndexOutOfBoundsException
Обновление №2
Содержание AppiumUsedPorts.txt
:
4723
4733
Содержание DeviceIDs.txt
5353352c
G000KU0663550R92
ports.collectEntries, names.collectEntries { port, name -> ...
? Этот синтаксис неверен. - person Szymon Stepniak   schedule 12.01.2018collectEntries
, и я хочу использовать его с той же переменнойsteps
, потому что я могу выполнитьsteps
только один раз. Как вы можете видеть во втором блоке кода, я пытался разделитьcollectEntries
запятой, но, как вы упомянули, это дает мне синтаксическую ошибку. Теперь мне нужна ваша помощь, как я могу использовать значенияports
иnames
в переменнойsteps
? - person rm -rf   schedule 12.01.2018