Jenkins “如何”;vars";在詹金斯共享图书馆工作?
我在Jenkins共享库中遇到了一些行为,如果有人能向我解释一下,那就太好了: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):
第一期 假设我在
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;