jenkins同时使用pop()来并行全局列表,导致无法pop()空列表?
需要帮助吗 Groovy或Jenkins DSL中多线程共享全局变量的问题 我试过各种方法,但似乎都不管用。这是我的詹金斯档案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
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%同步。