2

我有 Jenkins 管道共享库,它指定了一个提供两种方法的全局变量。 foo其中一个没有参数,另一个有一个可选参数:

/vars/foo.groovy

def getBarOne() {
    //...
}

def getBarTwo(String value = '') {
    //...
}

现在我想提供一个 IntellJ GSDL 文件,它支持这两种方法的有用代码完成。(我的 Jenkins 提供的 GSDL 只包含全局变量的定义,但不包含它的方法,所以我试图添加它。)

pipeline.gsdl(詹金斯)

//The global script scope
def ctx = context(scope: scriptScope())
contributor(ctx) {
//...
property(name: 'foo', type: 'org.jenkinsci.plugins.workflow.cps.global.UserDefinedGlobalVariable')
}
//..

pipeline.gsdl(被我拉皮条)

//The global script scope
def ctx = context(scope: scriptScope())
contributor(ctx) {
//...
property(name: 'foo', type: 'org.jenkinsci.plugins.workflow.cps.global.UserDefinedGlobalVariable')
}
def uservarCtx = context(ctype: 'org.jenkinsci.plugins.workflow.cps.global.UserDefinedGlobalVariable')
contributor (uservarCtx) {
    method name: 'getBarOne', type: 'java.lang.String', params: [:]
    method name: 'getBarTwo', params: [value:'java.lang.String'], type: 'List<String>'
}
//..

到目前为止,一切都很好。
但是,正如它所暗示的那样,我的 Jenkinsfile 中的代码完成并不完全令人满意

IntelliJ 代码完成建议

因为getBarOne()它暗示了.barOne.getBarOne(); 建议使用 for getBarTwo(..)only .getBarTwo(String value),尽管该参数是可选的。

如何在 GDSL 文件中指定参数是可选的,以便我得到建议的所有三个(有效的常规)选项barTwogetBarTwo()getBarTwo(String value)? (不幸的是,“GDSL AWESOMENESS”系列没有帮助。)

4

1 回答 1

2

要提供所有三个选项,必须在 GDSL 文件中指定两个方法签名。一个带有(可选)参数,一个没有它:

管道.gdsl

//...
def uservarCtx = context(ctype: 'org.jenkinsci.plugins.workflow.cps.global.UserDefinedGlobalVariable')
contributor (uservarCtx) {
    method name: 'getBarOne', type: 'java.lang.String', params: [:]
    method name: 'getBarTwo', params: [:], type: 'List<String>'     //<---
    method name: 'getBarTwo', params: [value:'java.lang.String'], type: 'List<String>'
}

自动完成建议:

完整的自动完成建议

奖励曲目:多个全局变量

由于我不仅有一个全局变量,而且还有两个,所以我也希望有自动完成功能来支持它。

这样做的诀窍是,为全局变量指定不同的类型:

管道.gsdl

//The global script scope
def ctx = context(scope: scriptScope())
contributor(ctx) {
//...
property(name: 'foo', type: 'org.jenkinsci.plugins.workflow.cps.global.UserDefinedGlobalVariable.Foo')
property(name: 'bar', type: 'org.jenkinsci.plugins.workflow.cps.global.UserDefinedGlobalVariable.Bar')
}
def varCtxFoo = context(ctype: 'org.jenkinsci.plugins.workflow.cps.global.UserDefinedGlobalVariable.Foo')
contributor (varCtxFoo) {
    //...
}
def varCtxBar = context(ctype: 'org.jenkinsci.plugins.workflow.cps.global.UserDefinedGlobalVariable.Bar')
contributor (varCtxBar) {
    //...
}
//..

请注意具有类型定义的类型的.Foo.Bar后缀。UserDefinedGlobalVariable

于 2019-02-27T19:10:06.510 回答