Groovy 在应用 remove() 后列表的 jenkins 行为
Groovy in jenkins behaviour of list after applying remove()
在使用 jenkins+ 方面,我是一个初学者 groovy。
我正在开发一个 groovy 脚本来识别当前排队的作业并删除任何重复项(如果它们的名称中有特定字符串)。
我目前拥有的是:
import hudson.model.*
q = jenkins.model.Jenkins.getInstance().getQueue()
items = q.getItems()
names = []
for (i=0;i<items.size();i++) {
names << items[i].task.getName()
}
names.sort()
println("#################################")
println("names[i] list with the component elements: \n")
for (i=0;i<names.size();i++) {
println(names[i])
}
for (i=0;i<names.size();i++) {
if (names[i].contains('Component')) {
//do nothing
} else {
names.remove(i)
}
}
println("#################################")
println("names[i] list without the component elements: \n")
for (i=0;i<names.size();i++) {
println(names[i])
}
所以我得到我的 jenkins 队列,我检索作业的名称,我对其进行排序,然后我从名称 [] 列表中删除任何不包含字符串 'Component' 的名称。
然后我尝试打印出 names[] 列表以查看是否所有适当的名称都已被删除。这是我的代码得到的输出:
#################################
names[i] list with the component elements:
TEST1_CJ
TEST2_CJ
rm-feat-rm-Consolidation_win64
rm-feat-rm-Vote_win64
acquisition-rm-feat-rm-Component_win64
data-rm-feat-rm-Vote_win64
lumiop-rm-feat-rm-Component_win64
ludesk-rm-feat-rm-Component_win64
lutop-rm-Component_win64
rm-feat-rm-Component_win64
#################################
names[i] list with the component elements:
TEST2_CJ
rm-feat-rm-Vote_win64
acquisition-rm-feat-rm-Component_win64
lumiop-rm-feat-rm-Component_win64
ludesk-rm-feat-rm-Component_win64
lutop-rm-Component_win64
rm-feat-rm-Component_win64
names.remove() 似乎有点半途而废了。它似乎只删除了test1、consolidation和第二个投票,但没有删除test2和另一个投票。
任何人都可以向我解释 names.remove() 的行为,也许我遗漏了什么。 groovy 文档并没有真正为我提供任何东西,所以...
谢谢!!
您从正在迭代的列表中删除了项目。对于您所追求的,groovy 中有 filterAll
。将它应用到列表上,它 return 是所有元素,当应用于闭包时 return groovy-truth。例如
def namesWithComponent = names.findAll{ it.contains('Component') }
在使用 jenkins+ 方面,我是一个初学者 groovy。
我正在开发一个 groovy 脚本来识别当前排队的作业并删除任何重复项(如果它们的名称中有特定字符串)。 我目前拥有的是:
import hudson.model.*
q = jenkins.model.Jenkins.getInstance().getQueue()
items = q.getItems()
names = []
for (i=0;i<items.size();i++) {
names << items[i].task.getName()
}
names.sort()
println("#################################")
println("names[i] list with the component elements: \n")
for (i=0;i<names.size();i++) {
println(names[i])
}
for (i=0;i<names.size();i++) {
if (names[i].contains('Component')) {
//do nothing
} else {
names.remove(i)
}
}
println("#################################")
println("names[i] list without the component elements: \n")
for (i=0;i<names.size();i++) {
println(names[i])
}
所以我得到我的 jenkins 队列,我检索作业的名称,我对其进行排序,然后我从名称 [] 列表中删除任何不包含字符串 'Component' 的名称。
然后我尝试打印出 names[] 列表以查看是否所有适当的名称都已被删除。这是我的代码得到的输出:
#################################
names[i] list with the component elements:
TEST1_CJ
TEST2_CJ
rm-feat-rm-Consolidation_win64
rm-feat-rm-Vote_win64
acquisition-rm-feat-rm-Component_win64
data-rm-feat-rm-Vote_win64
lumiop-rm-feat-rm-Component_win64
ludesk-rm-feat-rm-Component_win64
lutop-rm-Component_win64
rm-feat-rm-Component_win64
#################################
names[i] list with the component elements:
TEST2_CJ
rm-feat-rm-Vote_win64
acquisition-rm-feat-rm-Component_win64
lumiop-rm-feat-rm-Component_win64
ludesk-rm-feat-rm-Component_win64
lutop-rm-Component_win64
rm-feat-rm-Component_win64
names.remove() 似乎有点半途而废了。它似乎只删除了test1、consolidation和第二个投票,但没有删除test2和另一个投票。
任何人都可以向我解释 names.remove() 的行为,也许我遗漏了什么。 groovy 文档并没有真正为我提供任何东西,所以...
谢谢!!
您从正在迭代的列表中删除了项目。对于您所追求的,groovy 中有 filterAll
。将它应用到列表上,它 return 是所有元素,当应用于闭包时 return groovy-truth。例如
def namesWithComponent = names.findAll{ it.contains('Component') }