You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

代码说明

  1. 排序优化:先按路径分割后的段数升序排序,让父路径(段数更少)排在子路径前,能减少后续判断的次数。
  2. 核心判断逻辑:path.startsWith(other + '/')确保匹配的是完整的路径段(避免类似/lambda/copy和/lambda/copyPaymentInfo的误判),最终保留的都是没有父路径在列表中的基础路径。

内容的提问来源于stack exchange,提问作者Gunjit Sidher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 20:45:35