【问题标题】:Jenkins Pipeline external script returning a null valueJenkins Pipeline 外部脚本返回空值
【发布时间】:2017-05-25 21:27:58
【问题描述】:

我的问题类似于this one 关于如何加载外部 groovy 脚本,然后在不同的 groovy 脚本中调用它的方法。到目前为止,我已经能够让不返回值的方法起作用,但是我无法将返回值放入被调用的变量中。

例如,以下管道代码有效,但当我运行 Jenkins 管道时,$build_user 的值为 null。它实际上并没有返回我期望的结果,我不知道为什么。

node {
    stage('test') {
        def tools = load "/var/lib/jenkins/workflow-libs/vars/tools.groovy"
        build_user = tools.get_user()
        echo "build_user: $build_user"
    }
}

这是相关的tools.groovy 的样子。

def exampleMethod() {
    // Do stuff
}

// Try to get a build username
def get_user() {

    try {
        wrap([$class: 'BuildUser']) {
            // Set up our variables
            fallback_user = 'GitHub'
            github_user = BUILD_USER
            commit_author = 'Test1'

            // Try to use Jenkins build user first
            if (github_user) {
                echo "using github_user: $github_user"
                return github_user
            }
            // Otherwise try to use commit author
            else if (commit_author) {
                echo "using commit_author: $commit_author"
                return commit_author
            }
            // Otherwise username is blank so we use the default fallback
            else {
                echo "using fallback: $fallback_user"
                return fallback_user
            }
        }
    }
    catch (err) {
        // Ignore errors
    }

    echo "Done."
}

return this

这是上述代码的完整 Jenkins 输出。

Started by user XXX
[Pipeline] node
Running on master in /var/lib/jenkins/workspace/test
[Pipeline] {
[Pipeline] stage
[Pipeline] { (test)
[Pipeline] load
[Pipeline] { (/var/lib/jenkins/workflow-libs/vars/tools.groovy)
[Pipeline] }
[Pipeline] // load
[Pipeline] wrap
[Pipeline] {
[Pipeline] echo
using github_user: XXX
[Pipeline] }
[Pipeline] // wrap
[Pipeline] echo
Done.
[Pipeline] echo
build_user: null
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

如果我在最后删除return this并在Jenkins中抛出以下错误,则上述方法根本不起作用。

java.lang.NullPointerException:无法调用 get_user() 方法 空对象 ...

我做错了什么?我怀疑我遗漏了一些简单的东西,但我对 Groovy 不是很好,所以我不确定它可能是什么。

【问题讨论】:

    标签: jenkins groovy jenkins-pipeline


    【解决方案1】:

    你必须用return this结束你的tools.groovy
    查看这个问题的答案How do you load a groovy file and execute it

    【讨论】:

      【解决方案2】:

      你的函数 get_user() 什么都不返回。

      wrap([$class: 'BuildUser']) {...} 中的 return(s) 确实从 wrap 类返回,而不是从您的函数返回。

      【讨论】:

      • 就是这样。我没有返回内部,而是分配给一个变量并在 wrap 之后返回。
      猜你喜欢
      • 2015-01-19
      • 1970-01-01
      • 2021-10-28
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2022-09-29
      • 2019-10-22
      • 1970-01-01
      相关资源
      最近更新 更多