使用从另一个Groovy文件加载的枚举(Jenkins管道问题)
我将以下Groovy脚本作为Jenkins管道的一部分 groovy使用从另一个Groovy文件加载的枚举(Jenkins管道问题),jenkins,groovy,jenkins-pipeline,Jenkins,Groovy,Jenkins Pipeline,我将以下Groovy脚本作为Jenkins管道的一部分 groovy enum PermissionType { ANONYMOUS, AUTHENTICATED } def get_job_permissions(PermissionType permission) { ... } return this public class PermissionTypes { public enum Values { ANONYMOUS, AUTHENTICATE
enum PermissionType {
ANONYMOUS,
AUTHENTICATED
}
def get_job_permissions(PermissionType permission) {
...
}
return this
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()
作为Jenkins管道的一部分,我将这个文件加载到另一个Groovy文件中,并调用get_job_permissions作为参数通过其中一个枚举
groovy.lang.MissingPropertyException: No such property: PermissionType for class: Script3
管道.groovy
def job_permissions = load 'permissions.groovy'
job_permissions.get_job_permissions(job_permissions.PermissionType.AUTHENTICATED)
def job_permissions = load 'permissions.groovy'
job_permissions.get_job_permissions(job_permissions.Permissions.AUTHENTICATED)
Jenkins在这方面失败,并出现以下错误(我已经验证了在本例中'Script3'是使用enum参数获取_job_权限的调用)
我知道脚本加载和调用是正确的,因为我可以将get_job_permissions的签名更改为以下内容,在pipeline.groovy中传递一个随机字符串,调用就正确地进行了
def get_job_permissions(def permission) {
...
}
如果我不更改签名,并且仍然传递一个随机字符串,Jenkins将失败构建,因为它找不到它认为我正在调用的方法(这是真的,它不在那里,它需要PermissionType)
我尝试了许多不同的方法来向调用脚本公开PermissionType
- 添加@Field(非合法Groovy)
- 将枚举定义更改为public def PermissionType(非合法Groovy)
- 删除并向枚举定义中添加public
- 更改大小写(尽管我认为枚举需要以大写字符开头?)
谢谢我设法找到了工作——我当然知道这可能不是正确的,甚至不是好的方式,但它为我打开了障碍,给了我所需要的 而不是像通常那样在脚本中定义枚举
enum PermissionType {
ANONYMOUS,
AUTHENTICATED
}
我创建了一个包含枚举的类,其成员变量初始化为枚举中的值
groovy
enum PermissionType {
ANONYMOUS,
AUTHENTICATED
}
def get_job_permissions(PermissionType permission) {
...
}
return this
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()
然后,我可以在脚本中公开该类的一个实例,将其作为普通加载,最终获得对枚举值的访问权
管道.groovy
def job_permissions = load 'permissions.groovy'
job_permissions.get_job_permissions(job_permissions.PermissionType.AUTHENTICATED)
def job_permissions = load 'permissions.groovy'
job_permissions.get_job_permissions(job_permissions.Permissions.AUTHENTICATED)
我想我们都同意这有点疯狂,但它给了我所需要的
我对此仅有的问题(我现在可以接受)
- 您只能在脚本中加载文件,否则会出现重复的类异常
- 您不能在外部方法中使用该类型,只能使用值-对我来说可以,因为任何接受该类型的方法都是类定义的本地方法
我仍然想知道正确的方法:)我最近遇到了这个问题,找到了一个看起来不那么麻烦的解决方案
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
我更喜欢使用:
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
}
关于我发现自己处于同样的情况,我也将尝试这样做。我还认为这种方法有点疯狂和多余,我有点难过,现在没有更好的方法来做到这一点。