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') }