簡體   English   中英

使用從另一個 Groovy 文件加載的枚舉(Jenkins 管道問題)

[英]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 暴露給調用腳本

  • 添加@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)

我想我們都同意這有點瘋狂,但它給了我我需要的東西。

我只有這個問題(我現在可以忍受)

  • 您只能在腳本中加載文件,否則會出現重復的類異常
  • 您不能在外部方法中使用該類型,只能使用值 - 對我來說可以,因為任何采用該類型的方法都是類定義的本地方法

仍然很想知道這樣做的正確方法:)

我最近遇到了這個問題,並找到了一個看起來不那么笨拙的不同解決方案。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM