jenkins同时使用pop()来并行全局列表,导致无法pop()空列表?

jenkins同时使用pop()来并行全局列表,导致无法pop()空列表?,jenkins,groovy,jenkins-pipeline,jenkins-plugins,jenkins-groovy,Jenkins,Groovy,Jenkins Pipeline,Jenkins Plugins,Jenkins Groovy,需要帮助吗 Groovy或Jenkins DSL中多线程共享全局变量的问题 我试过各种方法,但似乎都不管用。这是我的詹金斯档案 def fill_list() { def test_list = [] for ( int i = 0; i < 160; i++ ) { test_list.add(i) } return test_list } pipeline { agent any stages { st

需要帮助吗 Groovy或Jenkins DSL中多线程共享全局变量的问题

我试过各种方法,但似乎都不管用。这是我的詹金斯档案

def fill_list() {
    def test_list = []
    for ( int i = 0; i < 160; i++ ) {
        test_list.add(i)
    }
    return test_list
}

pipeline {
    agent any

    stages {
        stage('Init Workspace') {
            steps {
                script {
                    test_list_generate = fill_list()
                //  println(test_list_generate)
                   }
            }
        }
        stage('Example Stage 2') {
            parallel {
                    stage('stream_1') {
                    agent { label 'infraTest' }
                        steps {
                            script {
                                while (test_list_generate.size() != 0) {
                                    sleep 4
                                    println(test_list_generate.size())
                                    println(test_list_generate.pop())
                                    println("node executor num: ${env.EXECUTOR_NUMBER}")
                                }
                            }
                        }
                    }
                    stage('stream_2') {
                    agent { label 'infraTest' }
                        steps {
                            script {
                                while (test_list_generate.size() != 0) {
                                    sleep 3
                                    println(test_list_generate.size())
                                    println(test_list_generate.pop())
                                    println("node executor num: ${env.EXECUTOR_NUMBER}")
                                }
                            }
                        }
                    }
            }
        }
    }
}

def fill_list(){
def测试_列表=[]
对于(int i=0;i<160;i++){
测试列表。添加(i)
}
返回测试列表
}
管道{
任何代理人
舞台{
阶段('初始化工作区'){
台阶{
剧本{
测试列表生成=填充列表()
//println(测试列表生成)
}
}
}
阶段(“示例阶段2”){
平行的{
阶段('stream_1'){
代理{label'infraTest'}
台阶{
剧本{
while(test_list_generate.size()!=0){
睡眠4
println(test\u list\u generate.size())
println(test\u list\u generate.pop())
println(“节点执行器编号:${env.executor_NUMBER}”)
}
}
}
}
阶段('stream_2'){
代理{label'infraTest'}
台阶{
剧本{
while(test_list_generate.size()!=0){
睡眠3
println(test\u list\u generate.size())
println(test\u list\u generate.pop())
println(“节点执行器编号:${env.executor_NUMBER}”)
}
}
}
}
}
}
}
}
如何解决这些问题?请将代码中的标签更改为本地有效标签

2021-05-11 23:04:47.221另外:java.util.NoSuchElementException:无法弹出空列表 2021-05-11 23:04:47.221位于org.codehaus.groovy.runtime.DefaultGroovyMethods.pop(DefaultGroovyMethods.java:8841)
2021-05-11 23:04:47.221在org.codehaus.groovy.runtime.dgm$483.domethodinodvoke(未知来源)

我认为jenkins管道是不可能的。因为相同的步骤可以在不同的节点上运行,变量可以序列化以在节点之间共享-因此,变量不能是并发的。这是可能的,但需要合理的方式,我认为list.asSynchronized()可能会有所帮助,但到目前为止还没有成功,您可以尝试使用
def list=new java.util.concurrent.LinkedBlockingQueue()
和类似
while((x=list.poll()){println x}
。但是,如果你有几个节点,不要期望它会100%同步。