代码之家  ›  专栏  ›  技术社区  ›  Hakanai

为什么Jenkins不运行这个循环的内容?

  •  0
  • Hakanai  · 技术社区  · 5 年前

    所以我有一个 Jenkinsfile 这样地:

    properties([
      [$class:   'BuildDiscarderProperty',
       strategy: [$class:               'LogRotator',
                  numToKeepStr:         '10',
                  artifactNumToKeepStr: '15']]
    ])
    
    List<String> buildFlavours = ['ubuntu', 'macosx']
    List<BuildStep> modulesGroups = [
      new BuildStep('UnitTestGroup1'),
      new BuildStep('UnitTestGroup2')
    ]
    
    println "*** outside loop, buildFlavours.size() = ${buildFlavours.size()}"
    buildFlavours.each { flavour ->
      println "*** inside loop, flavour = ${flavour}"
      println "*** outside loop, modulesGroups.size() = ${modulesGroups.size()}"
      modulesGroups.each { group ->
    
        // Doesn't work, silently terminates the pipeline with no error!
        println "*** inside loop, group = ${group}"
    
        // Somehow this works:
        // String groupCopy = group.toString()
        // println "*** inside loop, group = ${groupCopy}"
      }
    }
    
    class BuildStep {
      private String displayName
    
      BuildStep(String displayName) {
        this.displayName = displayName
      }
    
      @Override
      String toString() {
        return displayName
      }
    }
    

    当我运行它时,我得到以下输出:

    [Pipeline] properties
    [Pipeline] echo
    *** outside loop, buildFlavours.size() = 2
    [Pipeline] echo
    *** inside loop, flavour = ubuntu
    [Pipeline] echo
    *** outside loop, modulesGroups.size() = 2
    [Pipeline] echo
    *** inside loop, flavour = macosx
    [Pipeline] echo
    *** outside loop, modulesGroups.size() = 2
    [Pipeline] End of Pipeline
    

    为什么循环的内容似乎没有被执行,既没有打印消息也没有抛出错误?

    我得到的最好的线索是Jenkins正在使用Groovy CPS,也许出于某种原因,它可能会把代码重写得一团糟。

    到目前为止的调查:

    1. 它不会扔任何东西 Throwable -如果我试图抓住一个,什么也抓不到。
    2. 当我把循环中的println改为 toString() 首先,不知何故 工作和循环内部的信息确实会被打印出来,但我还不知道为什么。
    3. 制造 BuildStep 类序列化或更改其名称不会影响任何事情。
    4. 现在, filed a ticket 因为至少我认为糟糕的错误报告是可以修复的。
    0 回复  |  直到 5 年前