Jenkins “如何”;vars";在詹金斯共享图书馆工作?

Jenkins “如何”;vars";在詹金斯共享图书馆工作?,jenkins,jenkins-pipeline,jenkins-shared-libraries,Jenkins,Jenkins Pipeline,Jenkins Shared Libraries,我在Jenkins共享库中遇到了一些行为,如果有人能向我解释一下,那就太好了: 第一期 假设我在vars目录中有一个文件: // MultiMethod.groovy def Foo() { ... } def Bar() { ... } 现在,如果我想使用管道中的这些函数,我所做的是: // Jenkinsfile @Library('LibName') _ pipeline { ... steps { script { // Method (1):

我在Jenkins共享库中遇到了一些行为,如果有人能向我解释一下,那就太好了:

第一期 假设我在
vars
目录中有一个文件:

// MultiMethod.groovy

def Foo() { ... }

def Bar() { ... }
现在,如果我想使用管道中的这些函数,我所做的是:

// Jenkinsfile
@Library('LibName') _

pipeline {
  ...
  steps {
    script { 
        // Method (1): this will work
        def var = new MultiMethod()
        var.Foo()
        var.Bar()

        // Method (2) this will not work
          MultiMethod.Foo()
       }
  }

}
(方法(1)和(2)是在groovy脚本中调用方法的方法。请不要被“方法”这个词的这两种用法所混淆。)

因此,只有当我用
new
操作符实例化这个
multi方法时,它才会起作用

但是,如果我将文件命名为
multimemethod
(camelCased),而不是
multimemethod
,我可以使用方法(2)调用脚本中的方法。有人能解释这种行为吗

这似乎很有效

第二期 基于上面的例子。如果我有一个名为
MultiMethod
的groovy文件(我们在前面看到,如果我使用
new
实例化,我可以使用它的方法),那么动态加载库时,我似乎无法实例化
MultiMethod
的对象,如下所示:

// Jenkinsfile

pipeline {
  ...
  steps {
    script { 
        // Method (1): this will not work
        library 'LibName'
        def var = new MultiMethod()
        var.Foo()
        var.Bar()

       }
  }

}
如果我尝试这样做,我会得到:

Running in Durability level: MAX_SURVIVABILITY
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 11: unable to resolve class multiMethod 
 @ line 11, column 32.
                       def mult = new multiMethod()
                                  ^

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(CompilationUni  
...
编辑 我注意到,如果我这样做:

// Jenkinsfile

pipeline {
  ...
  steps {
    script { 
        library 'LibName'
        MultiMethod.Foo()
        MultiMethod.Bar()
       }
  }

}
它确实有用

最后一个问题 如果可以的话,还有一个问题。我注意到人们习惯于写作

return this
vars
目录中的脚本末尾。有人能解释一下它有什么好处吗?如果有人能解释一下这个机制是如何工作的,比如为什么这些脚本会变成全局变量,我会很高兴


谢谢

第一个问题的答案

这是因为Jenkins为共享库定义了这个标准。为了澄清您的疑问,Jenkins official中确实有一个很好的解释,如果您按照标准进行操作,它将起作用。如以下示例所示:

确保您遵循此文件夹结构

shared-library
├── src
│   └── org
│       └── any
│           └── MultiMethod.groovy
└── vars
    └── multiMethod.groovy
多方法.groovy

一旦您有了这个,并且您正在以类似的方式配置共享库,那么您就可以在Jenkins文件上使用
multi-method.groovy
,如下所示:

詹金斯档案

为什么会这样它解释了

但是要使用
src
文件夹中提供的
src/org/any/MultiMethod.groovy
,您必须实例化该类并调用该方法。下面是我的例子

多方法.groovy

詹金斯档案

第二个问题答案

你的第二个问题是重复的。我试着解释并给出了一个例子。请看一看

最后一个问题的答案

如果执行此操作,则无需从
vars
中定义的Jenkins全局变量
返回此值

vars/returnThisTest.groovy


两者都是相同的,从Jenkins文件中,您可以调用类似于
returnThisTest.helloWorld()
,但是当场景类似时,
返回此
会更有用-Jenkins文档中的一个很好的例子

您好,此网站的格式实际上无法在一个问题中处理多个问题。单击并一次关注一个问题,以便能够在格式中清楚地回答该问题。
def foo() {
  echo "Hello foo from vars/multiMethod.groovy"
}
def bar() {
  echo "Hello bar from vars/multiMethod.groovy"
}
@Library('jenkins-shared-library') _
pipeline {
    agent any;
    stages {
        stage('log') {
            steps {
                script {
                    multiMethod.foo()
                    multiMethod.foo()
                }
            }
        }
    }
}
package org.any

class MultiMethod {
    def steps;
    MultiMethod(steps) {
        this.steps = steps
    }
    def foo() {
        steps.echo "Hello foo from src/org/any/MultiMethod.groovy"
    }
    def bar() {
        steps.echo "Hello bar from src/org/any/MultiMethod.groovy"
    }
}
@Library('jenkins-shared-library') _
import org.any.MultiMethod

pipeline {
    agent any;
    stages {
        stage('log') {
            steps {
                script { 
                    def x= new MultiMethod(this);
                    x.foo()
                    x.bar()
                }
                
            }
        }
    }
}
def helloWorld() {
    echo "Hello EveryOne"
}

def helloWorld() {
    echo "Hello EveryOne"
}

return this;