1

似乎在以下代码中:

def formattedPaths = affectedFiles.collect {
    "${it.editType.name} ${it.path}"
}

至少有时formattedPaths评估为 GString 而不是 List。这段代码是一个更大的 Jenkins Workflow 脚本的片段,类似于:

node {
     currentBuild.rawBuild.changeSets[0].collect { 
         """<b>${it.user}</b> @ rev. ${it.revision}: ${it.msg}
         ${affectedFilesLog(it.affectedFiles)}"""
     }
}

def affectedFilesLog(affectedFiles) {
    println "Affected files [${affectedFiles.class}]: $affectedFiles"
    def formattedPaths = affectedFiles.collect {
        "${it.editType.name} ${it.path}"
    }

    println "formattedPaths [${formattedPaths.class}]: $formattedPaths"
    formatItemList(formattedPaths)
}

def formatItemList(list) {
    if (list) {
        return list.join('\n')
    }

    return  '(none)'
}

在 Jenkins 中运行此脚本会产生输出:

Running: Print Message
Affected files [class java.util.ArrayList]: [hudson.scm.SubversionChangeLogSet$Path@5030a7d8]
Running: Print Message
formattedPaths [class org.codehaus.groovy.runtime.GStringImpl]: edit my/path/flow.groovy
(...)
groovy.lang.MissingMethodException: No signature of method: java.lang.String.join() is applicable for argument types: (java.lang.String) values: [
]

这让我相信在代码中:

println "Affected files [${affectedFiles.class}]: $affectedFiles"
def formattedPaths = affectedFiles.collect {
    "${it.editType.name} ${it.path}"
}

println "formattedPaths [${formattedPaths.class}]: $formattedPaths"

affectedFilesArrayList(输出中的脚本Affected files [class java.util.ArrayList]: [hudson.scm.SubversionChangeLogSet$Path@5030a7d8]输出)

但是在其上运行 collect 方法的结果 - 分配给formattedPaths- 是一个 GString (输出formattedPaths [class org.codehaus.groovy.runtime.GStringImpl]: edit my/path/flow.groovy:)

收集方法不应该总是返回一个列表吗?

4

3 回答 3

3

在评论中的讨论指出这可能是由 Jenkins Workflow 插件完成的一些副作用之后,我决定使用一个普通的 for-each 循环:

def affectedFilesLog(affectedFiles) {
    println "Affected files [${affectedFiles.class}]: $affectedFiles"

    def ret = ""
    for (Object affectedFile : affectedFiles) {
        ret += affectedFile.path + '\n'
    }

    println("affectedFilesLog ret [${ret.class}]: $ret")
    if (!ret) {
        return '(brak)'
    }

    return ret;
}

编辑 19/11/2015:Jenkins 工作流插件错误处理采用闭包的函数,请参阅https://issues.jenkins-ci.org/browse/JENKINS-26481及其副本。因此,将代码重写为普通的 Java for-each 循环是最好的解决方案。

于 2015-11-05T11:14:10.327 回答
1

您目前无法使用该collect方法。詹金斯-26481

于 2015-11-04T17:25:01.890 回答
0

我猜你的代码不是线程安全的。如果您将某些对象作为参数传递给其他一些函数,请不要更改它。始终创建并返回一个新的更改对象。不要操纵原始数据。您应该检查您的对象所在的位置。它只是在函数内部还是在全局范围内?

于 2015-11-03T12:15:05.277 回答