[英]How to use methods from a global external java library in a Groovy Jenkins Pipeline?
首先,我是Java,Groovy和Jenkins的新手,所以请耐心等待我;)
我正在准备一个带有管道支持的Jenkins服务器,以备将来在我们的构建环境中使用。 我们使用一种特殊的内部脚本语言,为此我必须用Java编写包装器。 没有选择只能在Groovy中完成工作,我们必须使用这种特殊语言。
我尝试了许多将Java库引用到此jenkins项目的方法,但均无济于事。 主要是我使用了https://github.com/jenkinsci/workflow-cps-global-lib-plugin上的文档来实现此目的,但也尝试了几种搜索google或stackoverflow的方法。 根据文档,应该可以包括在内。
我已将过程简化为用于测试目的的测试设置。
假设以下...
我在詹金斯有一个名为“ 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项目中引用和使用此库没有问题。
我尝试了几种方法将其包括在内:
或动态加载:
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。
之后,我成功地导入了库并使用了它。
似乎很hacky,并且这类东西可能被认为是错误并且已删除,恕不另行通知。
如果您在管道中使用外部库( @Library
),则可以通过Grab定义@Library
依赖项。 下面的示例来自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.*
重要的是,上面的代码可能无法在管道本身中工作 ,但是当作为共享库的一部分加载时,它应该具有最新的插件版本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.