我将以下Groovy脚本作为Jenkins管道的一部分
permissions.groovy
enum PermissionType {
ANONYMOUS,
AUTHENTICATED
}
def get_job_permissions(PermissionType permission) {
...
}
return this
我将此文件作为Jenkins管道的一部分加载到另一个Groovy文件中,并调用get_job_permissions作为参数通过一个枚举。
pipeline.groovy
def job_permissions = load 'permissions.groovy'
job_permissions.get_job_permissions(job_permissions.PermissionType.AUTHENTICATED)
Jenkins对此失败,并出现以下错误(我已经证实在这种情况下,“ Script3”是使用enum参数调用get_job_permissions的方法。)
groovy.lang.MissingPropertyException: No such property: PermissionType for class: Script3
我知道脚本加载和调用是正确的,因为我可以将get_job_permissions的签名更改为以下内容,并通过pipeline.groovy中的随机字符串进行传递,并且调用可以正确进行。
def get_job_permissions(def permission) {
...
}
如果我不更改签名,但仍然传递随机字符串,则Jenkins将失败,因为它找不到它认为我正在调用的方法(这是真的,它不在那儿,期望有一个PermissionType类型)。
我尝试了多种不同的方法来将PermissionType暴露给调用脚本
这些解决方案都不能让我从调用脚本中引用枚举类型,而我理解这是因为我试图通过通过脚本实例进行引用来访问类型。
但是,如果我不能这样,那最好的方法是什么?
谢谢
答案 0 :(得分:2)
我设法找到了一些可行的方法-我当然知道这可能不是正确的方法,甚至不是好的方法,但是它畅通无阻,满足了我的需求。
而不是像通常那样在脚本中定义枚举
enum PermissionType {
ANONYMOUS,
AUTHENTICATED
}
我创建了一个包含枚举的类,并将其成员变量初始化为枚举中的值。
permissions.groovy
public class PermissionTypes {
public enum Values {
ANONYMOUS,
AUTHENTICATED
}
public final PermissionTypes.Values ANONYMOUS = PermissionTypes.Values.ANONYMOUS
public final PermissionTypes.Values AUTHENTICATED = PermissionTypes.Values.AUTHENTICATED
}
@Field final PermissionTypes Permissions = new PermissionTypes()
然后我可以在脚本中公开该类的实例,将其正常加载,最后可以访问枚举值。
pipeline.groovy
def job_permissions = load 'permissions.groovy'
job_permissions.get_job_permissions(job_permissions.Permissions.AUTHENTICATED)
我想我们都可以同意这有点疯狂,但这给了我我所需的东西。
只有这个问题(我现在可以忍受)
仍然会想知道正确的方法:)
答案 1 :(得分:0)
我最近遇到了这个问题,发现了一个看起来不太hacky的不同解决方案。
enum PermissionType {
ANONYMOUS,
AUTHENTICATED
}
def get_job_permissions(PermissionType permission) {
...
}
// Do this before you return out to make the enum available as well
this.PermissionType = PermissionType
return this
答案 2 :(得分:0)
我更喜欢使用:
MyEnumClass.groovy:
package cl.mypackage.utils
class MyEnumClass {
static enum MyEnum {
FOO, BAR, QWERTY
}
}
使用方法:
import cl.mypackage.utils.MyEnumClass
def in_some_place() {
def fooEnum = MyEnumClass.MyEnum.FOO
}
致谢