2017-05-25 23 views
0

我的问题类似于this one关于如何加载外部groovy脚本,然后在不同的groovy脚本中调用它的方法。到目前为止,我已经能够获得不返回值的方法,但是我无法将返回的值传入所调用的变量。Jenkins管道外部脚本返回一个空值

例如,下面的管道代码工作正常,但在运行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并不在所有的工作和引发以下错误在詹金斯。

显示java.lang.NullPointerException:无法 空对象 调用方法GET_USER()...

我在做什么错?我怀疑我错过了一些简单的东西,但我对Groovy并不擅长,所以我不确定它会是什么。

回答

1

你的功能get_user()什么也没有返回。

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

+0

就是这样。而不是回到里面我只是分配给一个变量,并在'wrap'后面返回。 – jmreicha