当前位置: 首页 > 知识库问答 >
问题:

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

怀德馨
2023-03-14

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

权限。棒极了

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参数获取_job_权限的调用)。

groovy.lang.MissingPropertyException: No such property: PermissionType for class: Script3

我知道脚本加载和调用是正确的,因为我可以将get_job_permissions的签名更改为以下内容,通过管道中的随机字符串传递。groovy和调用正确通过。

def get_job_permissions(def permission) {
  ...
}

如果我不更改签名,并且仍然传递一个随机字符串,Jenkins将失败构建,因为它找不到它认为我正在调用的方法(这是真的,它不在那里,它需要PermissionType)。

我尝试了许多不同的方法来向调用脚本公开PermissionType

  • 添加@Field(非合法Groovy)

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

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

谢谢

共有3个答案

秦禄
2023-03-14

我更喜欢使用:

髓鞘类。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
}

当做

谭云瀚
2023-03-14

我最近遇到了这个问题,并找到了一个不同的解决方案,看起来不那么麻烦。

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
荀增
2023-03-14

我设法让一些东西发挥作用——我当然知道这可能不是正确的,甚至不是好的,但它为我打开了障碍,给了我所需要的。

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

enum PermissionType {
  ANONYMOUS,
  AUTHENTICATED
}

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

权限。棒极了

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)

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

我对此仅有的问题(我现在可以接受)

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

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

 类似资料:
  • 根据Andrew Bayer的说法,您不应该向其他人注入声明性管道。将来可能会有人支持它,但可能不会。 我目前正在尝试在管道中启动一个管道,但我想知道我需要做什么才能使它工作。jenkins网页上的文档说明,如果新作业或管道与第一个作业或管道位于同一文件夹中,则可以从直接名称或绝对路径调用它。我已经尝试了所有不同的方法,目前我正在尝试一个文件的绝对路径,我刚刚检查过它一秒钟前存在,但它说它不存在。

  • 我目前正在尝试从jenkins管道中的文件加载一个自定义groovy类。我尝试了这里提出的解决方案: 如何在Jenkins管道中导入类文件? 作为... JenkinsPipelineUtilityClass.groovy 詹金斯档案 并尝试同样使用GroovyClassLoader(再次使用上述类) 詹金斯档案 我在这两方面都遇到了同样的错误: 我已经检查了正在进行的脚本批准,里面什么都没有,我

  • 问题内容: 有任何方法可以从具有参数的另一个管道触发管道作业,我已经尝试过 也尝试过 和 没有运气,它说: 项目类型不支持参数 问题答案: 由于子作业是另一个多分支管道项目,因此我需要指定我要运行的分支 现在可以用了

  • 关于Jenkins管道和Groovy方法,我这里有两个问题。首先,我有多个共享公共方法的构建,所以我认为最好将所有这些都放在一个类中,然后为每个构建导入文件。 Groovy脚本中的一段代码如下所示 在我的管道脚本中,我有 我遇到的第一个问题是如何在我的方法中使用,其次,当我收到错误时,如何在我的脚本中使用 哈德逊。远程处理。ProxyException:groovy。lang.MissingMet

  • 我对Jenkins pipeline非常陌生,我正在Groovy中构建一个小型共享库<在这种情况下,我试图提出一些单元测试,然后我必须模拟管道对象。 基本上,我有一个Groovy类,其中包含一个方法,该方法使用凭据执行一些操作: 因此,当谈到这个方法的单元测试时,我创建了一个PipelineMock Groovy类来(尝试)用凭据和用户名密码模拟

  • 所以我正在尝试为几个不同的项目制作一个多分支管道。 这些是基本要求: < li >每个客户有三项工作开发、准备和生产 < li >对于每个作业,从每个回购中提取相应的分支,并构建一个bot < li >如果作业正在使用的存储库中发生任何变化,则触发该环境的构建 所以这些要求非常简单。 但是还有第四个要求。我想弄清楚的是,我是否可以有一个回购,它可以保存我所有的Jenkins文件,然后构建另一个回购