![](/img/trans.png)
[英]Using class from another groovy file as a type in a Jenkins pipeline script
[英]Using an enum loaded from another Groovy file (Jenkins Pipeline issue)
我有以下 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 暴露给调用脚本
这些解决方案都不允许我从调用脚本中引用枚举类型,我理解这是因为我试图通过脚本实例引用它来访问类型。
但如果我不能这样做,最好的方法是什么?
谢谢
我设法让一些东西工作 - 我当然知道这可能不是正确的,甚至不是很好的方法,但它让我畅通无阻,并给了我所需的东西。
而不是像通常那样在脚本中定义枚举
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)
我想我们都同意这有点疯狂,但它给了我我需要的东西。
我只有这个问题(我现在可以忍受)
仍然很想知道这样做的正确方法:)
我最近遇到了这个问题,并找到了一个看起来不那么笨拙的不同解决方案。
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
我更喜欢使用:
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
}
问候
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.