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

标签 jenkins groovy jenkins-pipeline

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

权限.groovy

enum PermissionType {
  ANONYMOUS,
  AUTHENTICATED
}

def get_job_permissions(PermissionType permission) {
  ...
}

return this

我将此文件作为 Jenkins 管道的一部分加载到另一个 Groovy 文件中,并调用 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
  • 更改大小写(尽管我认为枚举需要以大写字符开头?)

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

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

    谢谢

    最佳答案

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

    而不是像通常那样在脚本中定义枚举

    enum PermissionType {
      ANONYMOUS,
      AUTHENTICATED
    }
    

    我创建了一个包含枚举的类,成员变量初始化为枚举中的值。

    权限.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)
    

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

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

  • 仍然很想知道这样做的正确方法:)

    关于jenkins - 使用从另一个 Groovy 文件加载的枚举(Jenkins 管道问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51976443/

    相关文章:

    jenkins - 部署由另一个作业构建的 Jenkins 工件

    groovy - CruiseControl:如何从执行任务中读取日志

    logging - Jenkins 管道日志记录

    gradle - 将作业参数传递到脚本化管道中的gradle任务

    jenkins - Jenkins中 'parameterized-scheduler'插件的使用方法

    docker - 在Jenkins中构建和运行Docker容器

    jenkins - 压缩 Jenkins Pipeline 中的目录

    java - 如何在 GPath 中按属性值查找元素?

    java - 如何在 jar 中包含 Groovy 扩展方法?

    jenkins - 如何限制 Jenkins 并发多分支管道构建?