我已经达到了一个点,我真的想用迭代构建多平台的时候,以节省阶段级别冗余代码。下面是展示我想要做的事:
def map = [
Bob : 42,
Alice: 54,
Max : 33
]
pipeline {
agent none
stages {
map.each { entry ->
stage ($entry.key) {
steps{
timestamps{
echo "$entry.value"
}
}
}
}
}
}
我觉得这里的概念是相当直接的,而是通过构建告诉我是失败的:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 13: Expected a stage @ line 13, column 9.
map.each { entry ->
^
WorkflowScript: 12: No stages specified @ line 12, column 5.
stages {
^
2 errors
这是否意味着詹金斯还没有支持用户,反覆阶段?如果有什么不对我做什么,请让我知道。谢谢!
- - -编辑 - - -
BTW,@NonCPS也试过,我不认为这是在管道脚本each
问题...
def map = [
Bob : 42,
Alice: 54,
Max : 33
]
pipeline {
agent none
stages {
iter_stages map
}
}
@NonCPS
def iter_stages(dd) {
dd.each { entry ->
stage ($entry.key) {
steps{
timestamps{
echo "$entry.value"
}
}
}
}
}
我认为这可以帮助你。我真的不知道你为什么要对迭代阶段,而不只是重复一个阶段的步骤内你的函数:
def map = [
Bob : 42,
Alice: 54,
Max : 33
]
pipeline {
agent any
stages {
stage('loop') {
steps {
loopNames(map)
}
}
}
}
def loopNames(map){
map.each {
key, value -> println "Age of " + key + " is " + value + ".";
}
}
在您的管道叫groovy function
并通过map
作为参数。下面的管道我定义函数的内容。
Output of this run:
[Pipeline] {
[Pipeline] stage
[Pipeline] { (loop)
[Pipeline] echo
Age of Bob is 42.
[Pipeline] echo
Age of Alice is 54.
[Pipeline] echo
Age of Max is 33.
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
OP是在正确的方向,但也有代码的几个问题:
script
块。steps
块,这意味着它不再声明)里面需要script
。这里是工作的OP希望的方式的代码:
def map = [
Bob : 42,
Alice: 54,
Max : 33
]
pipeline {
agent any
stages {
stage('Initialize') {
steps {
script {
map.each { entry ->
stage (entry.key) {
timestamps{
echo "$entry.value"
}
}
}
}
}
}
}
}
下面是该管道将如何看起来像:
既然是这样的话动态无论如何,它应该使用脚本语法管道代替上面(这是声明管道),这也使得它能够避免Initialize
阶段。
def map = [
Bob : 42,
Alice: 54,
Max : 33
]
node {
map.each { entry ->
stage (entry.key) {
timestamps{
echo "$entry.value"
}
}
}
}