我不知道如何定义动态共享库并将其用于我的管道:
myLib=library (identifier: 'lib@master', retriever: modernSCM(
[$class: 'GitSCMSource',
remote: 'https://mygit.orga.com/git/ORGA/Jenkins-libs.git',
credentialsId: 'aaaaaaa-8f3f-4e3c-vvvvvvv-6c77351e7872',
includes: '*',
excludes: 'test'
]))
pipeline {
agent {
node(){
label("linux&&!master")
}
}
tools {
jdk "JDK1.8.0_45"
maven "MVN339"
}
stages{
stage("test lib"){
steps {
script {
myLib.a.b.c.Utils.sayHelloTo("Guillaume")
log.info("test lib")
}
}
}
}
在运行时失败:
java.lang.ClassNotFoundException: Utils
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
关于什么是错的任何想法?我在网上找不到有关动态共享库教程的任何信息。
编辑:添加库树:
src
--a
--b
--c
Utils.groovy
Utils.groovy
内容:
package a.b.c
class Utils {
def sayHelloTo(String name) {
script.echo("Hello there $name")
}
}
谢谢大家, 纪尧姆
答案 0 :(得分:1)
我无法解释您所获得的CNFE,但是此代码肯定存在两个问题。
sayHelloTo
方法未声明为static
,但被称为一个方法。script.echo
似乎无效,因为在这里我看不到script
是有效名称。如果您要将其用作静态函数,则可以像这样更改函数
< def sayHelloTo(String name) {
> static sayHelloTo(def steps, String name) {
对调用的唯一更改是传递this
(应参考管道步骤):
< myLib.a.b.c.Utils.sayHelloTo("Guillaume")
> myLib.a.b.c.Utils.sayHelloTo(this, "Guillaume")
如果您想将其保留为实例方法,则仍然需要接受以下步骤:
< def sayHelloTo(String name) {
> def sayHelloTo(def steps, String name) {
但是,呼叫将发生如下变化:
< myLib.a.b.c.Utils.sayHelloTo("Guillaume")
> myLib.a.b.c.Utils.new().sayHelloTo(this, "Guillaume")
在所有情况下,echo
调用将更改为:
< script.echo("Hello there $name")
> steps.echo("Hello there $name")