如何从Jenkinsfile调用Groovy函数?

Ida*_*dar 6 groovy jenkins jenkins-pipeline

尽管遵循了这个答案和其他答案,但我无法在我的Jenkinsfile中成功使用本地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()
                      }
                  }
              }
          }
      }
      ...
      ...
  }
Run Code Online (Sandbox Code Playgroud)

deployer.groovy

#!/usr/bin/env groovy

def generateManifest() {
   sh "..."
   echo "..."
}
Run Code Online (Sandbox Code Playgroud)

在控制台日志(堆栈)中:

[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
Run Code Online (Sandbox Code Playgroud)

更新:

看来问题不在于加载文件,而在于文件的内容,我在其中执行以下操作显然无法正常工作:

sh "node $(pwd)/config/mustacher manifest.template.yml config/environments/common.json config/environments/someFile.json"
echo "..."
Run Code Online (Sandbox Code Playgroud)

如果只有echo则为堆栈

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

如果我将在管道中进行相同的节点调用(例如,在withCredentials if语句中,它将起作用)。

mko*_*bit 3

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

jenkins.ioreturn this上有记录:

获取工作区中的文件名并将其作为 Groovy 源文本运行。加载的文件可以包含顶层语句或仅加载并运行一个闭包。例如:

def pipeline
node('slave') {
    pipeline = load 'pipeline.groovy'
    pipeline.functionA()
}
pipeline.functionB()
Run Code Online (Sandbox Code Playgroud)

管道.groovy

def pipelineMethod() {
  ...code
}
    
return this
Run Code Online (Sandbox Code Playgroud)

pipeline.groovy以结尾之前定义了 functionA 和 functionB 函数(以及其他函数)return this