声明性管道中的动态并行步数

时间:2017-03-19 14:38:04

标签: jenkins jenkins-pipeline

我正在尝试创建一个声明性管道,它可以并行执行多个(可通过参数配置)作业,但我遇到了并行部分的问题。

基本上,由于某种原因,下面的管道会产生错误

 Nothing to execute within stage "Testing" @ line .., column ..

我无法弄清楚为什么或如何解决它。

import groovy.transform.Field
@Field def mayFinish = false

def getJob() {
    return {
        lock("finiteResource") {
            waitUntil {
                script {
                    mayFinish
                }
            }
        }
    }
}

def getFinalJob() {
    return {
        waitUntil {
            script {
                try {
                    echo "Start Job"
                    sleep 3 // Replace with something that might fail.
                    echo "Finished running"
                    mayFinish = true
                    true
                } catch (Exception e) {
                    echo e.toString()
                    echo "Failed :("
                }
            }
        }
    }
}

def getJobs(def NUM_JOBS) {
    def jobs = [:]
    for (int i = 0; i < (NUM_JOBS as Integer); i++) {
        jobs["job{i}"] = getJob()
    }
    jobs["finalJob"] = getFinalJob()
    return jobs
}

pipeline {
    agent any
    options {
        buildDiscarder(logRotator(numToKeepStr:'5'))
    }
    parameters {
        string(
            name: "NUM_JOBS",
            description: "Set how many jobs to run in parallel"
        )
    }
    stages {
        stage('Setup') {
            steps {
                echo "Setting it up..."
            }
        }
        stage('Testing') {
            steps {
                parallel getJobs(params.NUM_JOBS)
            }
        }
    }
}

我在旧的管道中看到了很多这样做的例子,但没有声明。 谁知道我做错了什么?

1 个答案:

答案 0 :(得分:2)

目前,在使用声明性管道时,似乎无法动态提供parallel分支。

即使您前面有stage,在script块中,您调用getJobs()并将其添加到绑定中,也会抛出相同的错误消息。

在这种情况下,您必须回退使用脚本管道。