170 похожих чатов

Есть некоторый грувишный скрипт с jenkins dsl: job('cron') { triggers

{
cron('#')
}
}
тут вызываются функциеподобные job и triggers, в которые передаются замыкания с какими-то действиями, и в итоге создаётся объект в дженкинсе и все счастливы

выношу вызов крона в отдельную функцию,
def mycron(x) {
cron(x)
}
, вызываю mycron('#') внутри triggers, дженкинс грязно ругается:
No signature of method: script.cron() is applicable for argument types: (java.lang.String) values: [#]
окей, логично, у самого объекта скомпилированного скрипта крона действительно нет

вертаю всё назад, дёргаю другую сигнатуру навроде cron(1, '#'):
No signature of method: javaposse.jobdsl.dsl.helpers.triggers.TriggerContext.cron() is applicable for argument types: (java.lang.Integer, java.lang.String) values: [1, #]
отлично, крон это метод TriggerContext, возвращаю вызов своего mycron(), в нём дёргаю javaposse.jobdsl.dsl.helpers.triggers.TriggerContext.cron(x):
No signature of method: static javaposse.jobdsl.dsl.helpers.triggers.TriggerContext.cron() is applicable...
тоже логично, крон не статическая функция, ему нужен объект... вот только откуда мне этот объект взять?

курил манул, пытался играться с this, owner, {owner}(), делегатами и стратегиями резолва оных, но остался у разбитого корыта
собственно вопрос: можно ли как-то так хитро написать mycron(), чтобы можно было его смело использовать внутри замыкания в triggers как обычный cron()? т.е. есть конечно вариант такой травы:
def mycron(obj, x) {
obj().cron(x)
}
mycron({owner}, '#')
, но какой-то он немножко кривой, хочется просто mycron('#')

вариант "нельзя" принимается, но тогда хотелось бы какое-то минимальное пояснение, как эта магия вообще работает, и почему в изначальном варианте крон резолвится куда надо, хотя оба замыкания вроде как инстанцируются в моём скрипте

3 ответов

16 просмотров

чет вопрос не по теме чата (( лично я стараюсь скрипты jenkins dsl делать максимально простыми, чтоб поменьше иметь дел с "магией", здесь лучше спросите https://t.me/devops_ru

Может быть, @bsideup поможет в этом деле?

понятия не имею че там в груви и темболее в его dsl`ах, но возможно вам помогут рассуждения со стороны такое чувство что job('cron') - создает экземпляр какого-то конкретного класса из библиотеки dsl`я, в котором есть поле или метод triggers которая содержит конкретный объект конкретного класса, в котором есть поле/метод cron который в конечном счете вызывается. эх жалко что в груви нет имплиситов чтобы неявно передавать контекст (хотя вероятно даже в скале бы вам в данной ситуации это не особо бы помогло) но вы можете сделать по аналогии с текущим решением - на наследовании вам нужно сделать некий метод myJob, который создает экземпляр уже ВАШЕГО класса Job, в котором есть поле triggers или myTriggers, в котором лежит объект вашего второго класса, который наследует исходный TriggerContext, в котором вы добавляете есть поле/метод myCron в котором уже доступен обычный cron тк они в рамках одного класса (надеюсь там не private cron) собственно, вообще говоря в таком случае возможно вам myCron и не нужен, а нужно переопределить cron в наследнике, а если вы хотите вызывать в конце него изначальный крон - сделать super.cron(..)

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта