Jenkins Job DSL动态并行步骤

时间:2019-01-15 00:19:05

标签: jenkins jenkins-plugins jenkins-job-dsl

当前情况:目前在Jenkins 1中,我让JobA和JobB分别使用某个文件JobAFile和JobBFile运行测试。作业的名称存储在数组中,并在下游参数化触发器中传递。

我现在正在分别为JobA和JobB创建动态创建的文件JobAFilePt1,JobBFilePt1,JobBFilePt2等。这需要我在parameterFactories中使用forMatchingFiles。但是,JobA内部有不同的作业,例如JobASubJob1,JobASubJob2,这弄乱了forMathcingFiles模式匹配。

为了解决这个问题,我尝试添加以下内容:

JobAJobs.each { String subJob->
    steps {
        downstreamParameterized {
            trigger('subJob') {
                paramterFactories {
                    forMatchingFiles("somePattern${subJob}")
                }
            }
        }
    }

问题:但这只是使其连续运行。如何获得并行运行的步骤?还是至少在触发器完成构建后才阻止它?我在网上看过,只找到了声明性管道和脚本化管道而不是Job DSL的解决方案。

作为另一种可能的解决方案::我现在正在将其设为一个阶段,并且每个phaseJob都是动态创建的。但是,由于我需要将“ n”个文件作为参数传递给特定文件(可以通过模式找到),因此我不确定如何实现此目的。如何动态为其赋予参数?

phase("Run jobs") {
    JobAJobs.each { String subJob -> {
        phaseJob("subJob") {
            parameters { 
                <someParameterType> 
            }
        }
    }
}

我想代替someParameterType尝试传递文件参数,但不确定如何处理。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

您的问题是典型的管道用例。当用于计划构建时,Job-DSL变得非常古怪。它不应用于此目的。 您可以简单地创建管道作业,并利用并行块。使用脚本语法,您可以执行以下操作:

node {
    stage("build") {
        parallel (
            JobAJobs.each { subJob ->
                build(
                    job: subJob,
                    parameters: [
                        [
                            $class: 'StringParameterValue',
                            name: 'PARAM_NAME',
                            value: 'myvalue'
                        ]
                    ]
                )
            }
        )
    }
}

This可以帮助您入门。