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

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

请问这是不是执行带返回值闭包的正确方式?如何获取并打印闭包的返回值?


解决方案

问题分析

  1. 闭包参数类型错误:snapshotCanBeDeleted方法的参数定义为final String s,但实际传入的是快照对象,类型不匹配会导致后续逻辑出错。
  2. 未捕获并行执行结果: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 21:06:00