持续集成 Pipeline share library 调用不到 src 目录的方法

TavisD · 2018年08月28日 · 最后由 fungaegis 回复于 2020年10月28日 · 2456 次阅读

想在 vars 目录调用 src 目录下写的方法,本地 IDE 执行没问题,但是在 Jenkins 里执行却调用不了,google 了好久也没解决,请问有同学碰到过吗?

目录结构

├── src
│   └── foo
│       └── DemoClass.groovy
└── vars
    └── varDemo.groovy

DemoClass.groovy 的内容

#!groovy
package foo

class DemoClass {
    def testDemoMethod() {
        println("src目录 DemoClass类 testDemoMethod方法")
    }
}

varDemo.groovy 的内容

#!groovy

import foo.DemoClass

def testVarsDemo() {
    println("vars目录 varDemo.groovy testVarsDemo方法")
}

def testVarsInvokeDemoMethod() {
    println("vars目录 varDemo.groovy testVarsInvokeDemoMethod方法")
    def demoClass = new DemoClass()
    demoClass.testDemoMethod()
    println("end vars目录 varDemo.groovy testVarsInvokeDemoMethod方法")
}

在 Jenkins 上的 Pipeline

@Library('tools') _

varDemo.testVarsDemo()

varDemo.testVarsInvokeDemoMethod()

Pipeline 执行后结果如下

 > git checkout -f b6176268be99abe300d514e1703ff8a08e3ef8da
Commit message: "test"
 > git rev-list --no-walk c1a50961228ca071d43134854548841a056e16c9 # timeout=10
[Pipeline] echo
vars目录 varDemo.groovy testVarsDemo方法
[Pipeline] echo
vars目录 varDemo.groovy testVarsInvokeDemoMethod方法
[Pipeline] echo
end vars目录 varDemo.groovy testVarsInvokeDemoMethod方法
[Pipeline] End of Pipeline
Finished: SUCCESS

代码有执行到了 testVarsDemo() 的方法,也打印出来了。执行了 testVarsInvokeDemoMethod() 方法,有打印出来,但是demoClass.testDemoMethod()里的方法却没有打印出来。
请问下这是因为什么?怎么解决?

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 6 条回复 时间 点赞

var 里不要直接去调 src 里的东西
在你的 pipeline 里把 src 里的实例作为参数传到 var 里用

我本来是打算一些常见的公共类,比如 Jira 操作类、tools 工具类就封装放在 src 里,然后 vars 里再实例化调用它们的方法。这样 pipeline 里就直接调用 vars 里的方法就好了,其他人引用时就方便很多。
不太明白你意思,可以稍微具体点吗?如果在 pipelien 里把 src 实例化,同时后面再调用 vars 里的方法的话,好像@Library('tools') _又引入不了 src 里的类了。

src 里也不一定要写类,可以写方法,然后 src 里的方法是可以调用同 package 里的类的
然后你的 pipeline 里可以直接用 src 里的方法

另外,pipeline 里可以引入 src 里的类的
我记得官方文档就有事例

您好,请问后续是如何解决的,我也遇到了同样的问题。

6楼 已删除

调用入口是:

def call(){
}

想问题主解决这个问题了吗?我查了很多资料 stack overflow 翻烂了也没找到解决方案.我也是想实现 将功能函数/类放在 src 然后在 vars 中创建模板库引用功能函数. 现在用 import 直接报错.......我看 github 上面别人也是这么用的....

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册