首页 文章

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

提问于
浏览
1

我有以下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)

  • 删除并向枚举定义添加public

  • 更改大小写(虽然我认为枚举需要以大写字母开头?)

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

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

谢谢

1 回答

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

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

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

    • 您只能在脚本中加载文件,否则会出现重复的类异常

    • 你不能在外部方法中使用类型,只能使用值 - 对我来说没问题,因为任何接受类型的方法都是类定义的本地方法

    仍然想知道正确的方法来做到这一点:)

相关问题