Jenkins文件中的类引用的Jenkins共享库

时间:2018-06-21 22:48:01

标签: 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。我正在jenkinsfile顶部的任何节点或管道指令外部使用以下步骤导入共享库:

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

我已经验证了该库已被拉出,因为我可以引用在vars/目录中创建的自定义DSL步骤。但是,当我编辑管道文件以创建该类的实例时,管道启动时会立即引发错误:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 1276: unable to resolve class Kubernetes 
 @ line 1276, column 16.
   def kube = new Kubernetes(this)
              ^

1 error

at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:958)
at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:605)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:554)
at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.doParse(CpsGroovyShell.java:133)
at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:127)
at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:557)
at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:518)
at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:290)
at hudson.model.ResourceController.execute(ResourceController.java:97)
at hudson.model.Executor.run(Executor.java:429)
Finished: FAILURE

据我所知,在引发该错误之前,甚至没有执行库请求。但是据我所知,这正是Jenkins docs中如何演示此功能的。我需要采取其他措施才能正确加载库吗?

2 个答案:

答案 0 :(得分:5)

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

Jenkins文档在library步骤中介绍了如何加载库中定义的类:

  

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

def utils = library('mylib').com.mycorp.jenkins.Utils.new(this)
utils.handyStuff()
     

来源:https://jenkins.io/doc/pipeline/steps/workflow-cps-global-lib/

在您的情况下,它意味着要执行以下操作:

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管道中没有使用太多动态库加载,实际上我使用的是全局库定义,例如:

enter image description here

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

@Library('default_jenkins_libs@master') _

import foo.bar.Kubernetes

def kub = new Kubernetes(this)

println kub

此示例产生的输出与上面粘贴的输出类似。希望对您有所帮助。

答案 1 :(得分:0)

您正在加载库吗?从Manage Jenkins»配置系统»Global Pipeline Libraries中,可以添加它,选择隐式加载一个引用。 此外,您可以在文件夹级别加载。

在非隐式加载的情况下,您必须添加

@Library('name-of-the-shared-lib@git-reference') _

到您的Jenkinsfile

完整的替代方法是documented at the pipeline docs