使用Jenkins共享库和DSL遇到很多麻烦。 当前,在我的源文件夹中,我声明了3个类:Constant,Utilities和EnvironmentManager。
常量不是静态类,而仅包含静态方法。 其他班是普通班。
在Jenkins文件中,我将以以下方式实例化并使用这些类:
def lib= library("sharedlib").com.foo
object= Constants.new()
object.getDefaultPath() // Works
Constants.getDefaultPath() // Works
com.foo.Constants.getDefaultPath() // Also Works
我正在尝试在DSL(位于库的vars文件夹中)上做同样的事情
def call(script, branch_to_build) {
script.echo com.foo.Constants.getDefaultPath() // Works
object = com.foo.Constants.new() // Fails see error 1
object = Constants.new() // Fails see error 2
}
我的问题是:为什么此行失败?我尝试了几种选择,但无法从其构造函数实例化一个对象。
错误1:
groovy.lang.MissingPropertyException:没有此类属性:com用于类: myDSL
错误2:
groovy.lang.MissingPropertyException:无此类属性:的常量 类别:myDSL
此外,尝试将库作为参数传递给它:
def call(script, library, branch_to_build) {
script.echo com.foo.Constants.get_build_windows_script()
constants = library.Constants.new()
}
java.lang.IllegalAccessException:com.foo.Constants定义于 文件://.../test_build_multi/EFS-1996_RemoveDuplicationFromJenkinsFiles/34/libs/sharedlib/vars/myDLS.groovy不在其中 文件://.../test_build_multi/EFS-1996_RemoveDuplicationFromJenkinsFiles/34/libs/sharedLibrary/src/
最后,如果我尝试在DSL顶部声明导入:
import com.foo
我得到:
\ ... \ builds \ foo \ Gitlab \ test_build_multi \ EFS-1996_RemoveDuplicationFromJenkinsFiles \ 35 \ libs \ sharedLibrary \ vars \ myDSL.groovy: 1:无法解析类com.foo @第1行,第1列。导入 com.foo
解决方法:
如果我这样声明我的DSL:
def call(com.foo.EnvironmentManager environment, com.foo.Utilities utilities, com.foo.Constants constants) {
node(constants.allowed_nodes()) {
ws(environment.get_custom_workspace()) {
....
}
}
}
然后一切正常。
但是我觉得这很愚蠢,因为它迫使我重复声明,而不必重复声明。
那么,如何在同一库DSL中使用自己的库类?
感谢帮助。