为什么这个 Groovy 类静态函数没有从其调用的 Jenkins 管道中执行?

问题描述 投票:0回答:1

我的 Groovy 共享库的目录结构:

+- src                       # Groovy source files
|   +- org
|       +- company
|           +- Stage.groovy  # for org.company.Stage class
+- vars
    +- func.groovy           # for global var func()

共享库在 Jenkins 全局管道库中配置为名称“foo”

共享库文件:

// src/org/company/Stage.groovy
package org.company;

class Stage  implements Serializable {
  static def func(d) {
    println("org.company.Stage.func()")
  }
}
// vars/func.groovy
def func(d) {
  println("func.groovy:func()")
}

在我的管道

Jenkinsfile
中,我尝试同时调用全局变量
func()
和类静态函数
org.company.Stage.func()

// Jenkinsfile
pipeline {
  agent any

    stages {
      stage('1') {
        steps {
          testLoadLib()
        }
      }
    }
}

void testLoadLib() {
  loadLibrary('foo@dev')
}

void loadLibrary(String libraryName) {
  def lib = library(libraryName)
  def d = [:]
  func.func(d)
  lib.org.company.Stage.func(d)
}

输出(针对相关性进行了编辑):

Loading library foo@dev
...
[Pipeline] echo
func.groovy:func()
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline

输出似乎表明全局变量

def func()
已执行——它的
println()
出现在控制台输出中。
但是类静态函数
org.company.Stage.func()
既没有错误也没有它的 println 出现在控制台输出中。

此管道中发生了什么及其对共享库函数的调用?
为什么只执行全局变量?
我需要什么才能执行类函数?

上面的代码基于 http://rtyler.github.io/jenkins.io/doc/book/pipeline/shared-libraries/ 的演练——但我不知道我做错了什么与该链接中记录的内容相比。

jenkins groovy jenkins-pipeline shared-libraries
1个回答
0
投票

对于一般的全局变量方法,

<groovy fiile name>.<method name>
(在您的情况下
func.func
)确实是正确的语法。但是,要从共享库调用方法,您首先需要使用构造函数实例化该类:

def stage = new org.company.Stage()
stage.func(d)

在您的使用中,命名空间语法不正确,并且该类被用作单例(据我所知,这与 Jenkins Pipeline 不兼容)。

或者您也可以

import org.company.Stage.func
来自库,但是
func
将由全局变量方法和库定义,这可能会导致问题。

您可以在问题中链接的文档的“访问步骤”部分查看有关此信息。

© www.soinside.com 2019 - 2024. All rights reserved.