使用Jenkins动态共享库进入管道

时间:2018-07-13 14:03:13

标签: jenkins jenkins-pipeline

我不知道如何定义动态共享库并将其用于我的管道:

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")
    }
}

谢谢大家, 纪尧姆

1 个答案:

答案 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")