Groovy .each只迭代一次

时间:2014-12-16 16:28:59

标签: jenkins groovy jenkins-pipeline

脚本没有遍​​历'模块的所有值。阵列。

class Module {
    public String name = '';
    public Boolean isCustom = false;
    public Module(String name, Boolean custom){
        this.name = name;
        this.isCustom = custom;
    }
}

//creates array from the ext_module env var
modules = [];
EXT_MODULE.split(',').each { 
    modules.add(new Module(it, false));
}


println modules;
modules.each {  
    println "MODULE NAME ::::: ${it.name}"
    if(it.isCustom)
    {
        println "install custom";
    } else {
        println "install non custom";
    }
};

这是运行的结果。该数组显示4个元素,但.each黑色内的代码只执行一次。

  

正在运行:打印消息   [Module @ 71f09325,Module @ e1ddb41,Module @ 7069a674,Module @ 1f68f952]
  正在运行:打印消息   MODULE NAME ::::: puppetlabs-ntp
  正在运行:打印消息   安装非定制
  运行:工作流程结束
  完成:成功

3 个答案:

答案 0 :(得分:9)

消息"正在运行:打印消息"和"运行:工作流程结束"表示您正在使用新的工作流程插件:https://wiki.jenkins-ci.org/display/JENKINS/Workflow+Plugin。这个插件目前有一个错误导致至少一些Groovy迭代涉及一次迭代后中止的闭包:https://issues.jenkins-ci.org/browse/JENKINS-26481

答案 1 :(得分:4)

解决方法是简单地使用旧学校进行循环(code below)。 此外,NonCPS是另一种解决方法。 这个问题有一个悬而未决的问题。见这里:https://issues.jenkins-ci.org/browse/JENKINS-26481

更新,2016年10月24日

/ **      *将环境变量转储到日志中,使用旧学校循环。      * /

import com.cloudbees.groovy.cps.NonCPS

def version = '1.0'

@NonCPS
def dumpEnvVars() {
  def str = "Dumping build environment variables...\n"
  for (Map.Entry<String, String> entry : currentBuild.build().environment) {
    str += "    ${entry.key} = ${entry.value}\n"
  }
  echo str
}

return this;

答案 2 :(得分:0)

截至昨天,新的Pipeline插件已在2.0版本中提供,并解决了这个问题。

.each闭包现在有效,但.collect仍然只会迭代一次。