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