如何在Jenkins声明式流水线中筛选列表的基础路径元素
问题
在Jenkins声明式流水线中,需从包含多级路径的列表里提取公共基础路径——即保留列表中的父路径,移除所有属于这些父路径的子路径(如/xxx/src、/xxx/test这类子路径)。
示例输入
myList = [ '/lambda/billMechanism/createCustomerOrderBill', '/lambda/billMechanism/createCustomerOrderBill/src', '/lambda/billMechanism/createCustomerOrderBill/test', '/lambda/billMechanism/isLastPaidBillInCracePeriod', '/lambda/billMechanism/isLastPaidBillInCracePeriod/src', '/lambda/billMechanism/isLastPaidBillInCracePeriod/test', '/lambda/copyPaymentInfo', '/lambda/copyPaymentInfo/src', '/lambda/copyPaymentInfo/test', '/lambda/custOrdWorkflFinancialCharge', '/lambda/custOrdWorkflFinancialCharge/src', '/lambda/custOrdWorkflFinancialCharge/test' ]
期望输出
myList = [ '/lambda/billMechanism/createCustomerOrderBill', '/lambda/billMechanism/isLastPaidBillInCracePeriod', '/lambda/copyPaymentInfo', '/lambda/custOrdWorkflFinancialCharge' ]
原低效实现
最初尝试嵌套循环处理,但执行效率较低:
for (int i = 0; i < myList.size(); i++) { s1 = "${myList[i]}" for (int j = i+1; j < myList.size(); j++) { sh "echo ${myList[j]}" } }
解决方案
利用Groovy的集合操作可以高效实现需求,避免嵌套循环的性能损耗,核心思路是筛选出不是任何其他路径子路径的条目:
高效实现代码
def myList = [ '/lambda/billMechanism/createCustomerOrderBill', '/lambda/billMechanism/createCustomerOrderBill/src', '/lambda/billMechanism/createCustomerOrderBill/test', '/lambda/billMechanism/isLastPaidBillInCracePeriod', '/lambda/billMechanism/isLastPaidBillInCracePeriod/src', '/lambda/billMechanism/isLastPaidBillInCracePeriod/test', '/lambda/copyPaymentInfo', '/lambda/copyPaymentInfo/src', '/lambda/copyPaymentInfo/test', '/lambda/custOrdWorkflFinancialCharge', '/lambda/custOrdWorkflFinancialCharge/src', '/lambda/custOrdWorkflFinancialCharge/test' ] // 先按路径长度升序排序,确保父路径排在子路径前(可选,但能略微提升判断效率) def sortedList = myList.sort { it.split('/').size() } // 筛选出所有不是其他路径子路径的条目 def basePaths = sortedList.findAll { path -> // 判断当前路径是否是其他路径的子路径(即存在某个路径是它的父路径) !sortedList.any { other -> other != path && path.startsWith(other + '/') } } // 输出结果 println basePaths
代码说明
- 排序优化:先按路径分割后的段数升序排序,让父路径(段数更少)排在子路径前,能减少后续判断的次数。
- 核心判断逻辑:
path.startsWith(other + '/')确保匹配的是完整的路径段(避免类似/lambda/copy和/lambda/copyPaymentInfo的误判),最终保留的都是没有父路径在列表中的基础路径。
内容的提问来源于stack exchange,提问作者Gunjit Sidher
相关产品推荐
相关产品推荐

