【问题标题】:How to use methods from a global external java library in a Groovy Jenkins Pipeline?如何在 Groovy Jenkins 管道中使用来自全局外部 java 库的方法?
【发布时间】:2017-04-06 05:14:16
【问题描述】:

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

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

我尝试了很多方法来将 java 库引用到这个 jenkins 项目,但都没有奏效。 主要是我使用https://github.com/jenkinsci/workflow-cps-global-lib-plugin 上的文档来实现这一点,但也尝试了几种搜索谷歌或 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 环境中设置类路径。
  • 使用插件“管道:类路径步骤”以不同的符号将库添加到类路径,例如'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。

如果可能的话,我想避免把它写成插件。

提前致谢!

【问题讨论】:

标签: java jenkins groovy jenkins-pipeline


【解决方案1】:

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

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

就我而言,它正在寻找

/usr/java/packages/lib/ext

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

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

看起来很hacky,可能会被视为错误并在不通知的情况下删除。

【讨论】:

  • 在 odbjc 驱动程序未加载 2 天后,您的解决方案拯救了我
【解决方案2】:

如果您在管道中使用外部库 (@Library),则可以通过 Grab 定义葡萄依赖项。下面的示例来自ciinabox-pipelines 共享库。这将下载 jars 并在 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.*

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

【讨论】:

  • 只是根据经验,这也失败了很多次,因为葡萄在解决/下载依赖库时遇到问题。 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
  • 2021-10-23
  • 1970-01-01
相关资源
最近更新 更多