Jenkins/Groovy:如何 declare/use 在 class 之外的枚举?

Jenkins/Groovy: How to declare/use an enum outside class?

我有一个从共享库 my_lib:

调用函数 setup() 的 Jenkinsfile
// Jenkinsfile
@Library('my_lib@dev') my_lib

import groovy.json.JsonOutput

pipeline {
  agent any

  stages {
    stage( "1" ) {
      steps {
        script {
          d = my_lib.setup();
        }
      }
    }
  }
}

shared-lib 函数尝试将枚举分配给字典元素。

// vars/my_lib.groovy
def setup() {
  def d = [:]
  d.a = org.foo.Foo.Event.A  // ok
  d.b = my_enum.getEvent()   // ok
  d.c = my_enum.Event.A      // groovy.lang.MissingPropertyException: No such property: Event for class: my_enum
}
// src/org/foo/Foo.groovy
public class Foo {
  enum Event {
    A,
    B;
  }
  def Foo() {}
}

my_enum.groovy 声明了一个枚举和一个 getter 函数,returns 这些枚举之一:

// vars/my_enum.groovy
public enum Event {
  A,
  B;
  def Event() {}
}

def getEvent() { return Event.A }

问题:
上面的代码在 my_lib.groovy at d.c = my_enum.Event.A 中失败,错误为 groovy.lang.MissingPropertyException: No such property: Event for class: my_enum

问题:
为什么分配 my_enum.Event.A 失败?
如何定义和使用“文件范围”枚举?
为什么在 class 范围内的枚举没问题时分配一个范围为 my_enum 的枚举会失败,而且 my_enum 中的一个简单包装函数 returns Event.A 也好吗?

1/ 为什么赋值my_enum.Event.A会失败?

这是一个简单的 groovy 代码,大致对应于您在 jenkins/groovy

中的问题 my_enum.groovy
class MY_ENUM {               // <- this class is not accessible for you in jenkins
  enum Event {A,B}
  def getEvent() { Event }    // <- i have changed this func on purpose 
}
def my_enum = new MY_ENUM()   // <- however my_enum variable is visible for you in jenkins

println MY_ENUM.Event.A       // works in plain groovy, but MY_ENUM class is not accessible in jenkins

要访问 java/groovy 中的内部枚举,您必须使用 CLASSNAME.ENUMNAME.KEY 访问器 - link

但是在 jenkins 中您无法访问 MY_ENUM 来执行此操作 MY_ENUM.Event.A

并且当您访问 my_enum.Event.A - 您试图从 class 的实例而不是 class 本身获取 Event - 所以,它失败了

2/ 如何定义和使用“file-scoped”枚举?

使用上面 class 中定义的函数 getEvent() 你可以这样做:

my_enum.getEvent().A

或这个 - groovy 将为这个访问器找到 getEvent() 函数

my_enum.event.A

不确定,但尝试这样定义 my_enum.groovy

enum Event {A,B}
return Event

那么这应该有效:

my_enum.A

3/ 当 class-scoped 枚举没问题时,为什么分配范围为 my_enum 的枚举会失败

因为 jenkins 中的每个文件都会产生一个 class 的实例,但是 class 本身是不可访问的。