Jenkins-Pipeline单stage控制并发构建流程,限制并发线程数量

1,380 阅读2分钟
一、这是一个demo

不单单用作并发构建docker镜像,因为使用sh'''  也是shell,也可作用其他类似用途

Jenkins并发还有另一个写法(详情看 在下面第四个)(不好扩展,新增并发步骤需要写上)

而单stage并发可让传入的参数个数去控制流程步骤,如传入S1-S18会有18个步骤,传入S1-S5就会生成5个

二、pipeline
def build_docker(service) {
stages = {
    def thing = null
    waitUntil {
        // 获取一个资源
        thing = latch.pollFirst();
        return thing != null;
    }
    try {
        // 执行步骤 
        stage("构建${service}服务Docker镜像") {
            withEnv(["service=${service}"]){
            sh '''
                echo "正在构建 ${service} 镜像"
                sleep 15
            '''
            }
        }
    }
    finally {
        // 释放一个资源
        latch.offer(thing)
    }        
}
return stages
}

pipeline {
agent {
    node {
        label "master"
    }
}

environment {
    // 规范:从Jenkins传入的变量,必须在这里填写后在引用
    build_com = "${build_com}"
}
        
parameters {
    // 参数化构建
    string defaultValue: 'S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 S11 S12 S13 S14 S15 S16 S17 S18', description: '需要构建的服务', name: 'build_com', trim: true
}

options {
    // 添加控制台时间戳
    timestamps()
    // 超时时间/分
    timeout(30)
    // 不允许并发编译
    disableConcurrentBuilds()
}

stages {
    stage("开始") {
        steps {
            script {
                sh '''
                     echo "start"
                '''
            }
        }
    }
    
    stage("并发进行构建Docker镜像") {
        steps {
            script {
                def stages = [:]
                // 并行进程数量
                MAX_CONCURRENT = 5
                // 创建fifo
                latch = new java.util.concurrent.LinkedBlockingDeque(MAX_CONCURRENT)
                 
                // 往fifo中,填入最大个数元素
                for(int i=0; i<MAX_CONCURRENT; i++)
                    latch.offer("$i")
                
                // 循环获取传入的值
                for (service in build_com.tokenize(' ')){
                    stages[service] = build_docker(service)
                }
                // 并行步骤
                parallel stages
            }
        }
    }
    
    stage("结束") {
        steps {
            script {
                sh '''
                    echo "done"
                '''
            }
        }
    }
    
}
} 
}
}

注意项:不要勾选使用 Groovy 沙盒

1-1.png

不然会出错误

.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use new java.util.concurrent.LinkedBlockingDeque int

1-2.png

三、结果图

1-3.png

1-4.png

1-5.png

四、另一种Jenkins并发写法
pipeline {

agent {
        node {
            label "master"
        }
}

stages {

    stage('开始') {
        steps {
            sh '''
                echo "start"
            '''
        }
    }

    stage('并发步骤') {
        parallel {
            stage('步骤1') {
                steps {
                    sh '''
                        echo "步骤1"
                    '''
                }
            }

            stage('步骤2') {
                steps {
                    sh '''
                        echo "步骤2"
                    '''
                    }
                }

            }
        }
    }

    stage('结束') {
        steps {
            sh '''
                echo "done"
            '''
        }
    }
            
}
}

原文链接:www.sdk.cn/details/1pB…

SDK社区是一个中立的社区,这里有多样的前端知识,有丰富的api,有爱学习的人工智能开发者,有风趣幽默的开发者带你学python,还有未来火热的鸿蒙,当各种元素组合在一起,让我们一起脑洞大开共同打造专业、好玩、有价值的开发者社区,帮助开发者实现自我价值!