如何从Jenkinsfile调用groovy函数?

时间:2017-03-14 16:07:04

标签: jenkins groovy jenkins-pipeline

尽管跟随this answer和其他人,我无法在我的Jenkins文件中成功使用本地groovy文件(两者都在同一个存储库中)。

def deployer = null
...
...
...
pipeline {
   agent {
      label 'cf_slave'
   }

   options {
      skipDefaultCheckout()
      disableConcurrentBuilds()
   }

   stages {
      stage ("Checkout SCM") {
         steps {
            checkout scm
         }
      }
      ...
      ...
      ...
      stage ("Publish CF app") {
          steps {
              script {
                  STAGE_NAME = "Publish CF app"
                  deployer = fileLoader.load ('deployer')

                  withCredentials(...) {   
                      if (BRANCH_NAME == "develop") {
                          ...
                          ...
                          ...
                      } else {
                          deployer.generateManifest()
                      }
                  }
              }
          }
      }
      ...
      ...
  }

deployer.groovy

#!/usr/bin/env groovy

def generateManifest() {
   sh "..."
   echo "..."
}

在控制台日志(stack)中:

[Pipeline] stage
[Pipeline] { (Publish CF app)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
before loading groovy file
[Pipeline] echo
Loading from deployer.groovy
[Pipeline] load
[Pipeline] // load
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage

更新

似乎问题不是加载文件而是加载文件的内容,我执行以下操作显然效果不佳:

sh "node $(pwd)/config/mustacher manifest.template.yml config/environments/common.json config/environments/someFile.json"
echo "..."

当只有echo时,this is the stack

所以不是sh "node ..."也不是echo。即使将其更改为sh "pwd"也会失败。会是什么呢?文件中的语法?在管道中调用它的方式?

如果我将在管道中进行相同的节点调用(例如在withCredentials if语句中,它可以正常工作。

1 个答案:

答案 0 :(得分:2)

return this文件的底部添加deployer.groovy,然后将load步骤更改为使用相对路径和扩展名为load('deployer.groovy')等groovy文件。

jenkins.io上记录了return this

  

在工作区中获取文件名并将其作为Groovy源文本运行。   加载的文件可以包含顶级语句,也可以只加载并运行闭包。例如:

def pipeline
node('slave') {
    pipeline = load 'pipeline.groovy'
    pipeline.functionA()
}
pipeline.functionB()
     

pipeline.groovy在以return this

结尾之前定义functionA和functionB函数(以及其他函数)的位置