Перейти к содержимому
Источник

Кулстори про danger-kotlin

У меня инфраструктурные недели. Переписываю CI-пайплайны, накручиваю автоматизации, кайф. Сейчас очередь дошла до danger-kotlin, дописывал несколько новых правил.

Кто не знает, это такая утилитка, которая смотрит на мёрж реквест, запускает какие-то проверки, и по API гитлаба/гитхаба обратно в этот мёрж реквест постит комментарий с результатами этих проверок.

Например, у нас там есть проверки размера реквеста. Если в нём больше N строк, то CI-пайплайн сразу же падает со словами типа "разбей на несколько, никто не будет это ревьювить". И на всех моих прогонах, где я корректировал Dangerfile конфиг – всё отрабатывало хорошо.

Но в каких-то реквестах рандомно эта джоба на CI зависала навсегда и падала по таймауту 😐. Всё руки не доходили разобраться. И вот добрался. Это уморительная история. Я всё это время думал, что там просто kotlin-скрипт не запускался из-за того, что вся эта технология сыроватая. Но нет.

У нас GitLab, и он через API не даёт статистику по MR. Git – даёт, потому что у него-то всегда можно посмотреть на дифф и посчитать количество плюсов/минусов. Поэтому мы в danger конфиге получали Git.additions, встроенную в danger-kotlin пропертю.

Как выяснилось – скрипт запускался стабильно, но вот при получении этой проперти всё висло. Следите за руками.

Git.additions под капотом вызывает git diff. Сам git diff под капотом показывает результаты с помощью less. В свою очередь, суть less в том, что на небольшом диффе он печатает результат в консоль и возвращает ей управление, а на большом открывает пейджинг режим, из которого как в виме нужно выходить через :q. Вот тут-то он и не может выйти. Ловушка джокера. 🤡

Как решилось: я вместо встроенной проперти написал свою, которая вместо git diff делает git diff --shortstat и парсит одну эту строчку вида 3 files changed, 12 insertions(+), 5 deletions(-). Ну или можно в коде функции git запускать с аргументом --no-pager. Но мне весь дифф не нужен, нужны только числа. Почему это реализовано не так изначально – загадка. Кажется, время делать пул реквест. 🕓