#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(