Jenkins共享库,类引用在Jenkins文件中

Jenkins共享库,类引用在Jenkins文件中,jenkins,groovy,shared-libraries,jenkins-pipeline,Jenkins,Groovy,Shared Libraries,Jenkins Pipeline,我正在构建一个共享库,我希望该库具有类定义,例如: class Kubernetes implements Serializable{ def script Kubernetes(script){this.script = script} def someMethod(){ ... } } 我已经将这个类定义放在一个共享库git repo中,路径为src/foo/bar/Kubernetes.groovy。我在Jenkins文件顶部的任何节点或管道指令之外使用以下步骤导

我正在构建一个共享库,我希望该库具有类定义,例如:

class Kubernetes implements Serializable{
    def script
    Kubernetes(script){this.script = script}
    def someMethod(){ ... }
}
我已经将这个类定义放在一个共享库git repo中,路径为
src/foo/bar/Kubernetes.groovy
。我在Jenkins文件顶部的任何节点或管道指令之外使用以下步骤导入共享库:

library identifier: 'custom-lib@master', retriever: modernSCM(
[$class: 'GitSCMSource',
remote: '<my-git-remote>',
credentialsId: '<my-credentials-id>'])
import foo.bar.*

据我所知,在抛出错误之前,库拉动甚至没有被执行。但据我所知,这正是在中演示此功能的方式。是否需要采取其他措施才能正确加载库?

是否正在加载库?从Manage Jenkins»Configure System»全局管道库,您可以添加它,选择隐式加载一个引用。 此外,还可以在文件夹级别加载

如果是非隐式加载,则必须添加

@Library('name-of-the-shared-lib@git-reference') _
到你的詹金斯档案


完整的备选方案是

动态加载库不会将类直接导入管道的类路径-这就是为什么会出现此异常,无论您引用的是完全限定的类名还是尝试导入(也会失败)

关于
library
步骤的Jenkins文档说明了如何加载库中定义的类:

您还可以加载库中定义的类,方法是选择它们的完全限定名(如此步骤返回值上的属性),然后调用静态方法或调用构造函数,就像它们是名为
new
的方法一样:

def utils = library('mylib').com.mycorp.jenkins.Utils.new(this)
utils.handyStuff()
资料来源:

在您的情况下,这意味着要做这样的事情:

def kub = library( identifier: 'my-custom-library@master', retriever: modernSCM([
    $class: 'GitSCMSource', remote: 'file:///var/jenkins_home/libraries', credentialsId: ''
])).foo.bar.Kubernetes.new(this)

println kub
这是我用于测试的本地示例库。当我运行管道时,它会成功并向控制台显示以下输出:

Started by user admin
[Pipeline] library
Loading library my-custom-library@master
Attempting to resolve master from remote references...
 > git --version # timeout=10
 > git ls-remote -h -t file:///var/jenkins_home/libraries # timeout=10
Found match: refs/heads/master revision 92e5e92f84f04293a405b2e05ec6497781ac3e47
 > git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
 > git config remote.origin.url file:///var/jenkins_home/libraries # timeout=10
Fetching without tags
Fetching upstream changes from file:///var/jenkins_home/libraries
 > git --version # timeout=10
 > git fetch --no-tags --progress file:///var/jenkins_home/libraries +refs/heads/*:refs/remotes/origin/*
Checking out Revision 92e5e92f84f04293a405b2e05ec6497781ac3e47 (master)
 > git config core.sparsecheckout # timeout=10
 > git checkout -f 92e5e92f84f04293a405b2e05ec6497781ac3e47
Commit message: "commit"
 > git rev-list --no-walk 92e5e92f84f04293a405b2e05ec6497781ac3e47 # timeout=10
[Pipeline] echo
foo.bar.Kubernetes@4ae7edb1
[Pipeline] End of Pipeline
Finished: SUCCESS
定义全局库 我在Jenkins管道中没有使用太多动态库加载,实际上我使用全局库定义,如:

在这种情况下,我可以使用以下内容加载库:

@Library('default\u-jenkins_libs@master') _
导入foo.bar.Kubernetes
def kub=新的Kubernetes(本)
普林顿库布

此示例生成与上面粘贴的输出类似的输出。希望能有帮助。

无论我做什么,我都无法让它发挥作用。试图复制上面给出的解决方案,我得到:
没有方法签名:org.jenkinsci.plugins.workflow.libs.LibraryStep$LoadedClasses.new()适用于参数类型:(WorkflowScript)
我可以通过从
new()中删除
来解决问题
方法调用。我不能在jenkins管道中加载个人java库,这太荒谬了。我花了两天的时间绕圈子。我要彻底抛弃詹金斯
Started by user admin
[Pipeline] library
Loading library my-custom-library@master
Attempting to resolve master from remote references...
 > git --version # timeout=10
 > git ls-remote -h -t file:///var/jenkins_home/libraries # timeout=10
Found match: refs/heads/master revision 92e5e92f84f04293a405b2e05ec6497781ac3e47
 > git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
 > git config remote.origin.url file:///var/jenkins_home/libraries # timeout=10
Fetching without tags
Fetching upstream changes from file:///var/jenkins_home/libraries
 > git --version # timeout=10
 > git fetch --no-tags --progress file:///var/jenkins_home/libraries +refs/heads/*:refs/remotes/origin/*
Checking out Revision 92e5e92f84f04293a405b2e05ec6497781ac3e47 (master)
 > git config core.sparsecheckout # timeout=10
 > git checkout -f 92e5e92f84f04293a405b2e05ec6497781ac3e47
Commit message: "commit"
 > git rev-list --no-walk 92e5e92f84f04293a405b2e05ec6497781ac3e47 # timeout=10
[Pipeline] echo
foo.bar.Kubernetes@4ae7edb1
[Pipeline] End of Pipeline
Finished: SUCCESS