詹金斯管道 - 在舞台上水平迭代

问题描述 投票:1回答:2

我已经达到了一个点,我真的想用迭代构建多平台的时候,以节省阶段级别冗余代码。下面是展示我想要做的事:

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"
                }
            }
        }
    }
}
jenkins jenkins-pipeline
2个回答
0
投票

我认为这可以帮助你。我真的不知道你为什么要对迭代阶段,而不只是重复一个阶段的步骤内你的函数:

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

0
投票

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"
                            }
                        }
                    }
                }
            }
        }
    }
}

下面是该管道将如何看起来像:

Pipeline view

既然是这样的话动态无论如何,它应该使用脚本语法管道代替上面(这是声明管道),这也使得它能够避免Initialize阶段。

def map = [
        Bob  : 42,
        Alice: 54,
        Max  : 33
]

node {
    map.each { entry ->
        stage (entry.key) {
            timestamps{
                echo "$entry.value"
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.