如何从Jenkins文件中调用groovy脚本?

时间:2017-04-10 13:18:28

标签: jenkins groovy

我试图将Jenkins文件中的内容分成一个groovy脚本来制作。但它无法调用这些脚本: 这是代码:

#!/usr/bin/env groovy

node('test-node'){

  stage('Checkout') {
    echo "${BRANCH_NAME} ${env.BRANCH_NAME}"
    scm Checkout

  }

  stage('Build-all-targets-in-parallel'){

    def workspace = pwd()
    echo workspace
    parallel(
      'first-parallel-target' :
       {
         // Load the file 'file1.groovy' from the current directory, into a variable called "externalMethod".
         //callScriptOne()
         def externalMethod = load("file1.groovy")
         // Call the method we defined in file1.
          externalMethod.firstTest()
       },
       'second-parallel-target' :
      {
         //callScriptTwo()
         def externalMethod = load("file2.groovy")
         // Call the method we defined in file1.
         externalMethod.testTwo()
        }
    )
  }
  stage('Cleanup workspace'){
    deleteDir()
  }
}

file.groovy

#!groovy

def firstTest(){

  node('test-node'){
    
    stage('build'){
      echo "Second stage"
    }
    
    stage('Cleanup workspace'){
      deleteDir()
    }
  }
}

看起来Jenkinsfile能够调用file1.groovy但总是给我一个错误:

java.lang.NullPointerException: Cannot invoke method firstTest() on null object

2 个答案:

答案 0 :(得分:6)

看起来您在正在加载的脚本中错过了返回:

return this

请在这里查看: https://jenkins.io/doc/pipeline/steps/workflow-cps/#load-evaluate-a-groovy-source-file-into-the-pipeline-script

因此,您调用的已加载文件将具有如下结构:

def exampleMethod() {
    //do something
}

def otherExampleMethod() {
    //do something else
}
return this

这样你就不应该得到空对象

答案 1 :(得分:4)

如果您想从外部文件中获取Jenkinsfile中的方法,则需要执行以下操作

file1.groovy中,返回对方法的引用

def firstTest() {
    // stuff here
}

def testTwo() {
    //more stuff here
}
...

return [
    firstTest: this.&firstTest,
    testTwo: this.&testTwo
]

修改

evaluate似乎不是必需的

def externalMethod = evaluate readFile("file1.groovy")

def externalMethod = evaluate readTrusted("file1.groovy")

正如@Olia所提到的

def externalMethod = load("file1.groovy")

应该有效

以下是readTrusted的参考资料。请注意,不允许参数替换(轻量级结账)

从轻量级结帐:

  

如果选择此选项,请尝试直接从SCM获取管道脚本内容,而不执行完整检出。这种模式的优点是效率高;但是,您不会根据SCM获得任何更改日志或轮询。 (如果在构建期间使用checkout scm,则会填充更改日志并初始化轮询。)此模式下,构建参数也不会替换为SCM配置。只有选定的SCM插件才支持此模式。

至少那对我有用