【问题标题】:Jenkins Shared Library src class - unable to resolve classJenkins 共享库 src 类 - 无法解析类
【发布时间】:2019-01-10 09:47:31
【问题描述】:

我正在寻找有关设计 Jenkins 共享库类的一些指导。使用全局变量作为共享库工作正常,但每次我在 src/ 中定义一个类并想导入它时,我都会收到无法解析类的错误。

这是我的共享库结构:

src
  - de
   - schlumpf
     - Tester.groovy
vars
  - sayHello.groovy

类 Tester.groovy

这是我想在管道作业中初始化的类的代码。

package de.schlumpf

public class Tester implements Serializable {
  public String name = "test"

  Tester(String pName) {
    this.name = pName
  }

  def sayHi() {
    echo "Hello, ${this.name}."
  }

  def sayHi(String name) {
    echo "Hello, ${name}."
  }
}

变量 sayHello.groovy

#!/usr/bin/env groovy

def call(String name = 'human') {
  echo "Hello, ${name}."
}

管道作业

@Library('pipeline-library-demo')
import de.schlumpf.Tester //de.schlumpf doesn't work as well

stage('Demo') {
    echo 'Hello world'
    sayHello 'test'

    def t = new Tester('Alice')
    t.sayHi()
}

在第 2 行我收到错误:无法解析 de.schlumpf.Tester 类。全局变量 sayHello 就像一个魅力...有谁知道我在这里做错了什么?

在系统设置中导入共享库:

我知道这看起来和这个相似,但我在我的路径中找不到错字或其他东西... Using Jenkins Shared Libraries as classes

官方文档在这里:https://jenkins.io/doc/book/pipeline/shared-libraries/

版本

  • 詹金斯:版本。 2.150.1
  • 管道 2.6
  • 管道:Groovy 2.61.1
  • 管道:共享 Groovy 库 2.12

【问题讨论】:

  • vars 代码中使用src 代码然后在管道中使用它通常更容易。
  • 我已经读过好几遍了。但是我必须使用静态方法。在 vars 文件夹中,我不能将类与对象一起使用,对吗?好吧,可以做到这一点,但我不明白为什么使用 src 文件夹如此复杂。我的意思是它已实现,所以为什么它没有按预期工作......一般我想使用对象而不是静态代码。
  • 我遇到了同样的问题。您已经找到解决方案了吗?
  • 还没有,我使用了 Var 解决方案。但是自从我实现它之后我就没有再测试它了
  • @MattSchuchard 如果有枚举(在 src 中)应该作为参数从 Jenkinsfile 传递给函数(在 var 中)怎么办?

标签: jenkins groovy shared-libraries jenkins-pipeline jenkins-shared-libraries


【解决方案1】:

它抛出一个错误,因为您在脚本块之外创建了一个类的对象。 试试下面的代码,它应该可以工作。

@Library('pipeline-library-demo')
import de.schlumpf.*;

stages{
    stage('Demo') {  
      steps{
        echo 'Hello world'
        sayHello 'test'
       script{
        def t = new Tester('Alice')
        t.sayHi()
       }
      }
   }
 }  

【讨论】:

  • 很遗憾这是不正确的。他说它在第 2 行抛出错误,重点是导入......
  • 你混淆了声明性和脚本化的管道。他使用脚本。
【解决方案2】:

当我动态加载库时,调用静态函数时遇到了类似问题:https://www.jenkins.io/doc/book/pipeline/shared-libraries/#loading-libraries-dynamically

这应该适合你:

def myLib = library 'pipeline-library-demo'
def t = myLib.de.schlumpf.Tester.new('Alice')
t.sayHi()

【讨论】:

    猜你喜欢
    • 2020-02-20
    • 2021-10-12
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多