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

时间:2018-08-22 23:23:29

标签: jenkins groovy jenkins-pipeline

我将以下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暴露给调用脚本

  • 添加@Field(不是合法的Groovy)
  • 将枚举定义更改为public def PermissionType(不是合法的Groovy)
  • 删除公共对象并将其添加到枚举定义
  • 更改大小写(尽管我相信枚举需要以大写字母开头吗?)

这些解决方案都不能让我从调用脚本中引用枚举类型,而我理解这是因为我试图通过通过脚本实例进行引用来访问类型。

但是,如果我不能这样,那最好的方法是什么?

谢谢

3 个答案:

答案 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)

我想我们都可以同意这有点疯狂,但这给了我我所需的东西。

只有这个问题(我现在可以忍受)

  • 您只能在脚本中加载文件,否则会出现重复的类异常
  • 您不能在外部方法中使用 type ,只能使用值-对我来说还可以,因为采用该类型的任何方法都是类定义的本地方法

仍然会想知道正确的方法:)

答案 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
}

致谢