Почему Groovy выдает ошибку MissingMethodException: нет подписи метода?

#jenkins #groovy

#дженкинс #groovy

Вопрос:

Я не знаю groovy, но мне нужно изменить поведение в конвейере Дженкинса. Я пытаюсь вызвать функцию из функции, и я получаю ошибку missingmethod exception. Я написал упрощенный пример в groovysh (скриншот). Чего я не понимаю?

 class Rocket implements Serializable {
    static List<String> channelsForAllEvents = []
}

Rocket.channelsForAllEvents = ["1", "2", "false"]
println(Rocket.channelsForAllEvents instanceof java.util.List)

def mycall() {
    rocket(Rocket.channelsForAllEvents as java.util.List)
}

def rocket(List<String> channels) {
    println(channels instanceof java.util.List)
    println(channels instanceof java.util.ArrayList)
    println channels
}

mycall()
  

введите описание изображения здесь

=====
Обновить:

 hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: static notify.rocket() is applicable for argument types: (java.util.ArrayList) values: [[build-centos7]]
Possible solutions: rocket(java.util.List), collect(), collect(groovy.lang.Closure)
    at groovy.lang.MetaClassImpl.invokeStaticMissingMethod(MetaClassImpl.java:1501)
    at groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1487)
    at org.codehaus.groovy.runtime.callsite.StaticMetaClassSite.call(StaticMetaClassSite.java:53)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
    at com.cloudbees.groovy.cps.sandbox.DefaultInvoker.methodCall(DefaultInvoker.java:20)
    at notify.call(notify.groovy:8)
    at mypackage.call(mypackage.groovy:33)
    ...
  

моя упаковка.отличная

 import groovy.transform.Field
import EnvPool as E

@Field String STEP_NAME = getClass().getName()
@Field Boolean catched = false

def call(Map config, Closure body) {
    println("Stage [${STEP_NAME}] begins")

    // hidden logic
    if (!E.hasChanges) {
        buildSetResult(currentBuild, "SUCCESS")
    } else {
        buildSetResult(currentBuild, "FAILURE")
    }
    notify.call(currentBuild)

    println("Stage [${STEP_NAME}] end")
}
  

уведомлять.заводной

 import EnvPool as E

def call(currentBuild) {
    if (currentBuild.result == "FAILURE") {
        notify.rocket(E.Rocket.channelsForAllEvents   E.Rocket.channelsForOnlyErrors)
    } else {
        notify.rocket(E.Rocket.channelsForAllEvents)
    }
}

def rocket(List<String> channels) {
    channels.each { channel ->
        rocketSend(...) // hidden impl
    }
}
  

И в Jenkinsfile я использую :

 E.Rocket.channelsForOnlyErrors = []
E.Rocket.channelsForAllEvents = ["build-centos7"]
  

Комментарии:

1. используйте groovyconsole или groovy вместо groovysh и ваш скрипт будет работать.

2. @daggett , я обновил вопрос, логика кода в Дженкинсе, похоже, та же, но я получаю сообщение об ошибке.

3. Заменить notify.rocket( на this.rocket(