[英]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.