减少 运行 个并行作业的管道脚本
Reduce the pipeline script for running multiple jobs parallel
我在下面的代码片段中获取匹配的作业名称,然后并行触发所有作业 运行。
共享库文件CommonPipelineMethods.groovy
import jenkins.instance.*
import jenkins.model.*
import hudson.model.Result
import hudson.model.*
import org.jenkinsci.plugins.workflow.support.steps.*
class PipelineMethods {
def buildSingleJob(downstreamJob) {
return {
result = build job: downstreamJob.fullName, propagate: false
echo "${downstreamJob.fullName} finished: ${result.rawBuild.result}"
}
}
}
return new PipelineMethods();
主要的 Jenkinsfile 脚本:
def commonPipelineMethods;
pipeline {
stages {
stage('Load Common Methods into Pipeline') {
def JenkinsFilePath = '/config/jenkins/jobs'
commonPipelineMethods = load "${WORKSPACE}${JenkinsFilePath}/CommonPipelineMethods.groovy"
}
stage('Integration Test Run') {
steps {
script {
matchingJobs = commonPipelineMethods.getIntegrationTestJobs(venture_to_test, testAgainst)
parallel matchingJobs.collectEntries{downstreamJob-> [downstreamJob.name, commonPipelineMethods.buildSingleJob(downstreamJob)]}
}
}
}
}
}
脚本运行良好,但从Map .... parallel step for parallel
来看,脚本有点忙,不太容易获得。这样做的主要目的是我想减少管道脚本,使其更干净,更容易让其他人帮助维护。一些简单的东西,比如将外部方法调用为 matchingJobs = commonMethods.getIntegrationTestJobs(venture, environment)
,这样其他人可以立即理解它并知道代码在这种情况下的作用。
我尝试了几种方法来改进它,但似乎将其中的一部分用于构建管道本身之外的单个作业,而是放入外部库中,例如
def buildSingleJobParallel (jobFullName) {
String tempPipelineResult = 'SUCCESS'
result = build job: jobFullName, propagate: false
echo "${jobFullName} finished: ${result.rawBuild.result.toString()}"
if (result.rawBuild.result.isWorseThan(Result.SUCCESS)) {
tempPipelineResult = 'FAILURE'
}
}
然后詹金斯提示我
groovy.lang.MissingMethodException: No signature of method: PipelineMethods.build() is applicable for argument types: (java.util.LinkedHashMap) values: [[job:test_1, propagate:false]]
我可以理解 build()
方法来自 Jenkins Pipeline Build Steps Plugins,但我无法导入它并在 commonMethods
库中使用它(这个本地库我只使用 load ()
方法在我的管道脚本的第一阶段。
所以我的问题是
- 我可以在上面提到的外部库中使用 Jenkins Pipeline Build Step 插件吗?
- 如果第一个问题不行,我想知道有没有更干净的方法让我的脚本更简单更干净?
谢谢大家!
不确定它是否可以运行并且看起来更清晰,但我只是尝试将所有问题和评论放在一起
//function that returns closure to be used as one of parallel jobs
def buildSingleJobParallel(steps, mjob){
return {
def result = steps.build job: mjob.fullName, propagate: false
steps.echo "${mjob.fullName} finished: ${steps.result.rawBuild.result}"
if (result.rawBuild.result.isWorseThan(Result.SUCCESS)) {
steps.currentBuild.result = 'FAILURE'
}
}
}
stage('Integration Test Run') {
steps {
script {
//build map<jobName, Closure> and run jobs in parallel
parallel matchingJobs.collectEntries{mjob-> [mjob.name, buildSingleJobParallel(this, mjob)]}
}
}
}
我在下面的代码片段中获取匹配的作业名称,然后并行触发所有作业 运行。
共享库文件CommonPipelineMethods.groovy
import jenkins.instance.*
import jenkins.model.*
import hudson.model.Result
import hudson.model.*
import org.jenkinsci.plugins.workflow.support.steps.*
class PipelineMethods {
def buildSingleJob(downstreamJob) {
return {
result = build job: downstreamJob.fullName, propagate: false
echo "${downstreamJob.fullName} finished: ${result.rawBuild.result}"
}
}
}
return new PipelineMethods();
主要的 Jenkinsfile 脚本:
def commonPipelineMethods;
pipeline {
stages {
stage('Load Common Methods into Pipeline') {
def JenkinsFilePath = '/config/jenkins/jobs'
commonPipelineMethods = load "${WORKSPACE}${JenkinsFilePath}/CommonPipelineMethods.groovy"
}
stage('Integration Test Run') {
steps {
script {
matchingJobs = commonPipelineMethods.getIntegrationTestJobs(venture_to_test, testAgainst)
parallel matchingJobs.collectEntries{downstreamJob-> [downstreamJob.name, commonPipelineMethods.buildSingleJob(downstreamJob)]}
}
}
}
}
}
脚本运行良好,但从Map .... parallel step for parallel
来看,脚本有点忙,不太容易获得。这样做的主要目的是我想减少管道脚本,使其更干净,更容易让其他人帮助维护。一些简单的东西,比如将外部方法调用为 matchingJobs = commonMethods.getIntegrationTestJobs(venture, environment)
,这样其他人可以立即理解它并知道代码在这种情况下的作用。
我尝试了几种方法来改进它,但似乎将其中的一部分用于构建管道本身之外的单个作业,而是放入外部库中,例如
def buildSingleJobParallel (jobFullName) {
String tempPipelineResult = 'SUCCESS'
result = build job: jobFullName, propagate: false
echo "${jobFullName} finished: ${result.rawBuild.result.toString()}"
if (result.rawBuild.result.isWorseThan(Result.SUCCESS)) {
tempPipelineResult = 'FAILURE'
}
}
然后詹金斯提示我
groovy.lang.MissingMethodException: No signature of method: PipelineMethods.build() is applicable for argument types: (java.util.LinkedHashMap) values: [[job:test_1, propagate:false]]
我可以理解 build()
方法来自 Jenkins Pipeline Build Steps Plugins,但我无法导入它并在 commonMethods
库中使用它(这个本地库我只使用 load ()
方法在我的管道脚本的第一阶段。
所以我的问题是
- 我可以在上面提到的外部库中使用 Jenkins Pipeline Build Step 插件吗?
- 如果第一个问题不行,我想知道有没有更干净的方法让我的脚本更简单更干净?
谢谢大家!
不确定它是否可以运行并且看起来更清晰,但我只是尝试将所有问题和评论放在一起
//function that returns closure to be used as one of parallel jobs
def buildSingleJobParallel(steps, mjob){
return {
def result = steps.build job: mjob.fullName, propagate: false
steps.echo "${mjob.fullName} finished: ${steps.result.rawBuild.result}"
if (result.rawBuild.result.isWorseThan(Result.SUCCESS)) {
steps.currentBuild.result = 'FAILURE'
}
}
}
stage('Integration Test Run') {
steps {
script {
//build map<jobName, Closure> and run jobs in parallel
parallel matchingJobs.collectEntries{mjob-> [mjob.name, buildSingleJobParallel(this, mjob)]}
}
}
}