如何在Groovy Jenkins管道中使用全局外部Java库中的方法?

首先,我是Java,Groovy和Jenkins的新手所以请耐心等待我;)

我正在准备一个支持Pipeline的Jenkins服务器,以便将来在我们的构建环境中使用。 我们使用一种特殊的内部脚本语言,我必须在java中编写一个包装器。 没有选择只在Groovy中完成这项工作,我们必须使用这种特殊语言。

我已经尝试了很多方法将java lib引用到这个jenkins项目但是都没有用。 主要是我使用了https://github.com/jenkinsci/workflow-cps-global-lib-plugin上的文档来实现这一点,但也尝试了几种搜索google或stackoverflow的方法。 在文档之后,这应该是可能的。

我已将流程简化为测试设置以进行测试。

假设以下……

我在Jenkins有一个名为’MultibranchTestProject01’的多分支项目。
jenkins文件:

@Library('DeltaJenkinsScripts@develop') def runStageCollect = true if (runStageCollect) { stage("Collect") { helloWorld("Joe") } } 

引用的库通过Jenkins设置中的“全局管道库”全局引用,但也明确说明了这些内容。 它托管在一个git环境中,引用似乎有效。 该库的文件结构:

/vars/helloWorld.groovy

 package de.dcomp.prod def call(name) { def tt = new Test() tt.testText() } 

/src/de/dcomp/prod/Test.groovy

 package de.dcomp.prod import de.dcomp.ftel.* def testText() { def sRetVal = "" echo "testText - START" //sRetVal = ScriptRunner.GetStaticSampleText() def oSR = new ScriptRunner() sRetVal = oSR.GetInstanceSampleText() echo "ReturnValue: ${sRetVal}" } 

我有一个名为ScriptRunner-0.0.1-SNAPSHOT.jar的java库。 这个库有一个类:

 package de.dcomp.ftel; public class ScriptRunner { public String GetInstanceSampleText() { return "ScriptRunner.GetInstanceSampleText() called..."; } public static String GetStaticSampleText() { return "ScriptRunner.GetStaticSampleText() called..."; } } 

我在独立的java项目中引用和使用这个库没有问题。

我尝试了几种方法来包含它:

  • 将jar文件放到’C:\ Users \ cr.groovy \ lib’
  • 在测试linux环境中设置Classpath。
  • 使用插件“Pipeline:Classpath Steps”将库添加到不同表示法的类路径中,例如’C:\ Users \ cr.groovy \ lib’,C:/Users/cr/.groovy/lib’,’C: \ Users \ cr.groovy \ lib \ ScriptRunner-0.0.1-SNAPSHOT.jar’,’C:/Users/cr/.groovy/lib/ScriptRunner-0.0.1-SNAPSHOT.jar’,’file:/// C:/Users/cr/.groovy/lib/ScriptRunner-0.0.1-SNAPSHOT.jar”
  • 将lib添加到本地maven存储库并引用每个@GrabResolver和@Grab,虽然这不是我想要的解决方案

或动态加载:

 this.class.classLoader.rootLoader.addURL(new URL("file:///C:/Users/cr/.groovy/lib/ScriptRunner-0.0.1-SNAPSHOT.jar")); def srClass = Class.forName("de.dcomp.ftel.ScriptRunner") def sr = srClass.newInstance() 

结果总是这样的。

 groovy.lang.MissingPropertyException: No such property: ScriptRunner for class: de.dcomp.prod.Test 

或这个:

 de/dcomp/prod/Test.groovy: 10: unable to resolve class ScriptRunner @ line 10, column 12. def oSR = new ScriptRunner() 

错误消息始终指向进程无法找到Java库的方向。 如果我尝试使用其他库,例如来自Apache Commons,也会发生同样的事情。

如果可能的话,我想避免将其写为插件。

提前致谢!

到目前为止我发现的唯一方法是在管道中运行它以找出正在检查的目录:

 println System.getProperty("java.ext.dirs") 

就我而言,它正在寻找

 /usr/java/packages/lib/ext 

所以我把我想加载的jar放在那个位置(在创建目录之后),然后重新启动Jenkins。

之后我成功地导入了库并使用它。

看起来非常h​​acky和那种可能被认为是错误并且在没有通知的情况下删除的东西。

如果您在管道中使用外部库( @Library ),则可以通过Grab定义葡萄依赖项。 以下示例来自ciinabox-pipelines共享库。 这将下载jar并在groovy脚本中自动加载它们。

 @Grab(group='com.amazonaws', module='aws-java-sdk-ec2', version='1.11.198') import com.amazonaws.services.ec2.* import com.amazonaws.services.ec2.model.* import com.amazonaws.regions.* 

重要的是,上面的代码可能无法在管道本身中工作 ,但是当作为共享库的一部分加载时,它应该具有最新的插件版本。