最近我看到很多类似的问题,所以我觉得这将是一个有趣的练习……
通过代码可视化,矩阵/多配置作业实际上只需要几个嵌套的for循环,每个参数轴都需要一个。
你可以用一些硬编码的for循环来构建一个相当简单的东西来遍历一些列表。或者你可以变得更加复杂,并做一些递归循环,这样你就不必硬编码特定的循环。
免责声明: 我做的运维比写代码多。我也很新于groovy,所以这可能可以更干净地完成,并且可能还有很多更酷的事情可以做,但无论如何它都可以完成工作。
稍加修改,这个matrixBuilder可以包装在一个类中,这样你就可以传递一个任务闭包和轴列表,并获得任务映射。把它放在共享库中,随时使用。应该很容易添加一些其他多配置作业的功能,例如过滤器。
这个尝试使用一个递归的matrixBuilder函数来处理任意数量的参数轴并构建所有组合。然后并行执行它们(显然取决于节点的可用性)。
def axisList = [
["ubuntu","rhel","windows","osx"],
["jdk6","jdk7","jdk8"],
["banana","apple","orange","pineapple"]
]
def tasks = [:]
def comboBuilder
def comboEntry = []
def task = {
def myAgent = it[0]
def myJdk = it[1]
def myFruit = it[2]
return {
node(myAgent) {
println "Executing combination ${it.join('-')}"
def javaHome = tool myJdk
println "Node=${env.NODE_NAME}"
println "Java=${javaHome}"
}
node {
println "fruit=${myFruit}"
}
}
}
comboBuilder = { def axes, int level ->
for ( entry in axes[0] ) {
comboEntry[level] = entry
if (axes.size() > 1 ) {
comboBuilder(axes[1..-1], level + 1)
}
else {
tasks[comboEntry.join("-")] = task(comboEntry.collect())
}
}
}
stage ("Setup") {
node {
println "Initial Setup"
}
}
stage ("Setup Combinations") {
node {
comboBuilder(axisList, 0)
}
}
stage ("Multiconfiguration Parallel Tasks") {
parallel tasks
}
stage("The End") {
node {
echo "That's all folks"
}
}
您可以在构建页面的“Pipeline Steps”链接下查看作业详细流程。具体链接为:
http://localhost:8080/job/multi-configPipeline/[build]/flowGraphTable/。
编辑:
您可以将阶段移动到“任务”创建中,然后更清晰地查看每个阶段的详细信息,但不像多配置作业那样整齐地显示在矩阵中。
...
return {
stage ("${it.join('-')}--build") {
node(myAgent) {
println "Executing combination ${it.join('-')}"
def javaHome = tool myJdk
println "Node=${env.NODE_NAME}"
println "Java=${javaHome}"
}
node {
println "fruit=${myFruit}"
}
}
}
...
或者您可以为每个节点
单独包装一个stage
,以获得更详细的信息。
在这样做时,我注意到了我的先前代码中的一个错误(现已修复)。我将comboEntry
引用传递给任务。我应该发送一份副本,因为尽管阶段名称是正确的,但当它实际执行它们时,值显然都是遇到的最后一个条目。因此,我将其更改为tasks [comboEntry.join(“ - ”)] = task(comboEntry.collect())
。
我注意到您可以保留并行任务的执行周围的原始stage(“Multiconfiguration Parallel Tasks”) {}
。现在从技术上讲,您有嵌套阶段。我不确定Jenkins应该如何处理它,但它没有抱怨。但是,“父”阶段的计时不包括并行阶段的计时。
我还注意到,当新构建开始运行时,在作业的“阶段视图”中,所有以前的构建都会消失,可能是因为阶段名称不完全匹配。但是在构建完成运行之后,它们全部匹配,并且旧构建再次显示出来。
最后,Blue Ocean似乎没有以相同的方式进行可视化。它不识别并行进程中的“阶段”,只识别封闭阶段(如果存在)或如果不存在,则为“并行”。然后仅显示各个并行进程,而不是其中的阶段。
localhost
地址的链接没有什么帮助。 - Jesse Chisholm