我正在运行一个声明式管道,其中一个步骤运行一个(非常长的)集成测试。我正在尝试将我的测试分成几个较小的测试并在多个节点上并行运行它们。我有 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
数组中获取节点名称并指示舞台使用它?