jenkins - Jenkins 流水线和 Groovy。并行迭代事物直到它们完成
问题描述
我正在勾勒出一个 Jenkins 管道。我可以在 5 个并行节点上以 8 组为一组运行测试,直到测试完成。
下面我将其简化为在 3 个节点上执行 8 个组。
我想知道我是否可以在管道中循环阶段以完成它们,直到我完成每个阶段。
TESTS.collate(8).collate(3).each {
parallel {
stage('run tests 1') {
agent { label 'node1' }
runTests(it[0])
}
stage('run tests 2') {
agent { label 'node2' }
runTests(it[1])
}
stage('run tests 3') {
agent { label 'node3' }
runTests(it[2])
}
}
}
解决方案
这是我的 Jenkinsfile 的相关部分
def splitNBTests = NB_TESTS.split("\n").toList().collate(7)
println(splitNBTests)
if (!params.runCukes) {
echo "SKIPPING NEW BUSINESS RUN IN OZ JOB DUE TO DISABLED PARAMETER"
} else {
SUITE_RUN_ID = UUID.randomUUID().toString()
def commands = splitNBTests.collect { def testsForNode ->
createCmdLineForCukes(testsForNode, PROFILE)
}
try {
TAGS = '"@regression ~@wip"'
SCENARIO_COUNT = "${DIRECTORY_CHANGE} && bundle && bundle exec rake run_scenario_count[${TAGS},${PROFILE}] SUITE_RUN_ID=${SUITE_RUN_ID}"
sh(returnStdout: true, script: SCENARIO_COUNT)
def stepsForParallel = [:]
commands.toList().eachWithIndex { def myCommand, int i ->
stepsForParallel["RunTests${i}"] = {
stage("RunTests${i}") {
node {
label 'grange-jenkins-slave'
sh("mount -a")
sh(myCommand)
}
}
}
}
parallel stepsForParallel
我在 Kubernetes 上有我们的 Jenkins Master,它带有 Kubernetes 插件来动态扩展从属 pod。对于我们当前的回归运行,如果我们在每个节点上运行 7 个测试,这可能会产生大约 24 个节点,但我们现在限制它一次运行 10 个。
我所说的“白名单”是在进行中的脚本批准下。我目前将其设置为staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods getAt java.lang.Object java.lang.String
.
我猜这应该被锁定多一点。提示赞赏。我从 Ruby 来到 Groovy,并用最少的时间来真正学习 Groovy。我会说它足够相似,从 Groovy 社区获得帮助肯定很有用,这样我就可以了解 Groovy 相当于#each_slice
Ruby 中的#collate
. 谢谢!
推荐阅读
- javascript - 提交和取消按钮不起作用,并且弹出窗口会导致可折叠面板关闭。我们如何解决这个问题?
- go - 短格式 goroutine 返回值
- vb.net - vb.net 在 TabControl 中查找以指定字符串开头的文本框名称
- ios - 尝试将 UILabel 设置为 UISegmentedControl 项时遇到类型问题
- python - 数据框中的 Groupby 并将完整行列表传递给缩减函数
- responsive-design - 使用 bootstrap-vue 不会自动滚动
- php - 带有ajax响应的laravel
- visual-studio-code - vscode打不开文件
- algorithm - 搜索树并返回仅包括结果的树子集的高效算法
- django - 我可以使用 Django 的模板来启动 react JS 吗?