使用从另一个Groovy文件加载的枚举(Jenkins管道问题)

使用从另一个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

我将以下Groovy脚本作为Jenkins管道的一部分

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()
作为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
}

关于

我发现自己处于同样的情况,我也将尝试这样做。我还认为这种方法有点疯狂和多余,我有点难过,现在没有更好的方法来做到这一点。