【问题标题】:Jenkins Shared Library - Importing classes from the /src folder in /varsJenkins 共享库 - 从 /vars 中的 /src 文件夹导入类
【发布时间】:2020-02-20 00:31:01
【问题描述】:

我正在尝试为我的 CI 流程编写一个 Jenkins 共享库。我想在\vars 文件夹中定义的全局函数内引用\src 文件夹中的一个类,因为它允许我将大部分逻辑放在类中而不是全局函数中。我遵循 Jenkins 官方文档中记录的存储库结构: Jenkins Shared Library structure

这是我所拥有的一个简化示例:


/src/com/example/SrcClass.groovy

package com.example

class SrcClass {
  def aFunction() {
    return "Hello from src folder!"
  }
}

/vars/classFromVars.groovy

import com.example.SrcClass

def call(args) {
  def sc = new SrcClass()
  return sc.aFunction()
}

詹金斯文件

@Library('<lib-name>') _
pipeline {
  ...
  post {
    always {
      classFromVars()
    }
  }
}

我的目标是让/vars 文件夹中的全局类充当一种公共外观,并在我的Jenkinsfile 中将其用作自定义步骤,而不必在script 块中实例化一个类(使其与声明性管道兼容)。这对我来说似乎很简单,但是在运行 classFromVars 文件时出现此错误:

<root>\vars\classFromVars.groovy: 1: unable to resolve class com.example.SrcClass
 @ line 1, column 1.
   import com.example.SrcClass
   ^

1 error

我尝试在本地和 Jenkins 服务器上直接使用 groovy CLI 运行 classFromVars 类,但在这两个环境中我都有相同的错误。我还尝试在运行/vars 脚本时指定类路径,得到相同的错误,使用以下命令:

<root>>groovy -cp <root>\src\com\example vars\classFromVars.groovy

我想要实现的目标可能吗?或者我应该简单地将我的所有逻辑放在/vars 类中并避免使用/src 文件夹?

我在 GitHub 上找到了几个似乎表明这是可能的存储库,例如这个:https://github.com/fabric8io/fabric8-pipeline-library,它在/vars 文件夹中的许多类中使用/src 文件夹中的类。

【问题讨论】:

  • 假设您从共享库的根文件夹运行groovy,正确的类路径如下:groovy -cp src/ vars/classFromVars.groovy。你的例子很好;我看不出有什么不妥。尝试提交更改,检查 Jenkins 配置页面中的全局共享库配置是否设置正确,并使用示例管道测试您的库。它应该可以工作,或者至少您应该得到更详细的错误消息。
  • -cp 参数是对的!当我在本地运行它时,它现在可以工作了。我讨厌成为那些人中的一员,但它现在在本地和服务器上都可以工作,我真的不知道为什么它不能在 Jenkins 环境中工作。非常感谢!

标签: jenkins groovy jenkins-shared-libraries


【解决方案1】:

正如@Szymon Stepniak 所指出的,我的groovy 命令中的-cp 参数不正确。它现在可以在本地和 Jenkins 服务器上运行。我还没有解释为什么它不能在 Jenkins 服务器上运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 2018-01-28
    相关资源
    最近更新 更多