Я запускаю декларативный конвейер, где на одном из шагов выполняется (очень длинный) интеграционный тест.Я пытаюсь разделить свой тест на несколько меньших и запустить их параллельно на нескольких узлах.У меня есть 8 из этих небольших тестов, и у меня есть 8 узлов (под меткой), поэтому я бы хотел, чтобы каждый тест выполнялся на отдельном узле.К сожалению, два теста - при запуске на одном и том же узле - мешают друг другу, поэтому оба теста заканчиваются неудачей.
Мне нужно сначала получить список доступных узлов, а затем параллельно запустить меньшие тестыпо одному на каждый узел;если узлов недостаточно, один из меньших тестов должен дождаться завершения работы узла.
Однако, случается, что при запросе узла по метке два из меньших тестов обычно получают одинаковыеузел, и поэтому оба терпят неудачу.Узлы настроены для запуска до 3 исполнителей, в противном случае вся система останавливается, поэтому я не могу это изменить.
Моя текущая конфигурация для меньшего теста:
stage('Integration Tests') {
when {
expression {params.TESTS_INTEGRATION}
}
parallel {
stage('Test1') {
agent {node {label 'my_builder'}}
steps {
script {
def shell_script = getShellScript("Test1")
sh "${shell_script}"
}
}
}
Я могу получить список доступных рабов из метки, подобной этой:
pipeline {
stages {
// ... other stages here ...
stage('NodeList'){
steps {
script {
def nodes = getNodeNames('my_builder')
free_nodes = []
for (def element = 0; element < nodes.size(); element++) {
usenode = nodes[element]
try {
// Give it 5 seconds to run the nodetest function
timeout(time: 5, unit: 'SECONDS') {
node(usenode) {
nodetest()
free_nodes += usenode
}
}
} catch(err) {
}
}
println free_nodes
}
}
}
Где
def getNodeNames (String label) {
def lgroup = Jenkins.instance.getLabel(label)
def nodes = lgroup.getNodes()
def result = []
if (nodes.size() > 0) {
for (def element = 0; element < nodes.size(); element++) {
result += nodes[element].getNodeName()
}
}
return result
}
def nodetest() {
sh('echo alive on \$(hostname)')
}
Как программно получить имя узла из массива free_nodes
и указать сцене использовать его?