【问题标题】:Using an enum loaded from another Groovy file (Jenkins Pipeline issue)使用从另一个 Groovy 文件加载的枚举(Jenkins Pipeline 问题)
【发布时间】:2018-08-22 23:23:29
【问题描述】:

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

permissions.groovy

enum PermissionType {
  ANONYMOUS,
  AUTHENTICATED
}

def get_job_permissions(PermissionType permission) {
  ...
}

return this

我将此文件加载到另一个 Groovy 文件中,作为我的 Jenkins 管道的一部分,并调用 get_job_permissions 作为参数传递其中一个枚举。

管道.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)
  • 在枚举定义中删除和添加 public
  • 更改大小写(尽管我认为枚举需要以大写字符开头?)

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

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

谢谢

【问题讨论】:

    标签: jenkins groovy jenkins-pipeline


    【解决方案1】:

    我设法让一些东西发挥作用 - 我当然知道这可能不是正确的,甚至不是好的方法,但它让我畅通无阻,给了我需要的东西。

    而不是像往常一样在脚本中定义枚举

    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()
    

    然后我可以在脚本中公开该类的实例,正常加载它,最后我可以访问枚举值。

    管道.groovy

    def job_permissions = load 'permissions.groovy'
    job_permissions.get_job_permissions(job_permissions.Permissions.AUTHENTICATED)
    

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

    我唯一遇到的问题(我现在可以忍受)

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

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

    【讨论】:

    • 我也遇到了同样的情况,我也准备尝试一下。我也认为这种方法有点疯狂和多余,我有点遗憾目前没有更好的方法来做到这一点。
    【解决方案2】:

    我最近遇到了这个问题,发现了一个看起来不那么老套的不同解决方案。

    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
    

    【讨论】:

      【解决方案3】:

      我更喜欢使用:

      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
      }
      

      问候

      【讨论】:

        猜你喜欢
        • 2017-02-24
        • 1970-01-01
        • 2012-04-29
        • 2017-01-03
        • 1970-01-01
        • 1970-01-01
        • 2021-01-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多