如何在Jenkins Pipeline中并行执行带返回值的闭包并获取结果?
问题:如何获取并行执行闭包的返回值并打印?
我需要批量检查AWS EBS快照是否符合删除条件,由于快照数量多,想并行执行检查逻辑。已获取JSON格式的快照列表:
{ "Snapshots": [ { "Description": "", "Encrypted": false, "OwnerId": "0123456789", "Progress": "100%", "SnapshotId": "snap-0123456789", "StartTime": "2021-03-23T23:58:42.019000+00:00", "State": "completed", "VolumeId": "vol-ffffffff", "VolumeSize": 8, "OwnerAlias": "amazon", "StorageTier": "standard" }, // 更多快照 ] }
用于判断快照是否可删除的闭包定义如下:
// Closure to check if I can delete snapshot private Closure snapshotCanBeDeleted(final String s) { return { s.State.equals("completed") } }
并行执行闭包的代码:
// Get a list of snapshots via AWS SDK or CLI in JSON def snapshots = functionToGetAListOfSnapshots() // function not shown // Create a map of snapshots and closures that can be run in parallel Map<String, Closure> map = new TreeMap() snapshots.Snapshots.each { map.put(it.SnapshotId, snapshotCanBeDeleted(it)) } parallel map // This runs the snapshotCanBeDeleted(it) closures in parallel
尝试打印结果时,执行以下代码:
map.each {k,v -> println "Snapshot $k can be deleted: $v" }
得到的输出是闭包对象而非布尔值:
snap-0123456789 can be deleted: [Pipeline] echo snap-1234567890 can be deleted: [Pipeline] echo snap-9876543210 can be deleted:
期望输出是:
snap-0123456789 can be deleted: true [Pipeline] echo snap-1234567890 can be deleted: false [Pipeline] echo snap-9876543210 can be deleted: true
请问这是不是执行带返回值闭包的正确方式?如何获取并打印闭包的返回值?
解决方案
问题分析
- 闭包参数类型错误:
snapshotCanBeDeleted方法的参数定义为final String s,但实际传入的是快照对象,类型不匹配会导致后续逻辑出错。 - 未捕获并行执行结果:
parallel步骤执行后会返回一个包含所有任务结果的Map,你之前直接遍历原闭包Map,打印的是闭包对象本身,而非执行后的布尔值。
修正后的代码
1. 修正闭包定义
将参数类型改为匹配快照对象的类型(用def兼容任意对象结构):
private Closure snapshotCanBeDeleted(final def snapshot) { return { snapshot.State.equals("completed") } }
2. 捕获并行执行结果并打印
// 获取快照列表 def snapshots = functionToGetAListOfSnapshots() // 构建并行任务Map Map<String, Closure> parallelTasks = new TreeMap() snapshots.Snapshots.each { snap -> parallelTasks.put(snap.SnapshotId, snapshotCanBeDeleted(snap)) } // 执行并行任务并捕获结果 Map<String, Boolean> results = parallel parallelTasks // 遍历结果打印 results.each { snapId, canDelete -> println "Snapshot $snapId can be deleted: $canDelete" }
说明
parallel步骤返回的resultsMap中,每个键值对对应一个快照的检查结果(布尔值)。- 修正闭包参数类型后,能正确访问快照对象的
State属性。 - 直接遍历
resultsMap即可获取每个快照的可删除状态,输出符合预期的结果。
内容的提问来源于stack exchange,提问作者Chris F
相关产品推荐
相关产品推荐

