Просматривая статистику посещений, обратил внимание на то, что многих интересует словосочетание «redmine jabber». Пришла пора удовлетворить спрос. В начале «как обычно» небольшая предыстория о том, «как всё начиналось»:
Несколько лет назад мне удалось внедрить redmine на «производстве», коллеги потихоньку втягиваясь в процесс, затребовали «книгу отзывов и предложений». Одним из первых пожеланий была замена стандартных уведомлений по email на, успевшие уже войти в моду, jabber-уведомления, которые мы используем для нотификации о новых коммитах в svn. Я вооружился тем самым поисковым запросом, о котором упомянул и немедленно нашёл нужной функциональности готовый плагин. Помимо уведомлений, автор обещал нам некие таймеры, которые можно стартовать/останавливать посредством команд боту в чате, тем самым «точно» подсчитывать затраченное на решение задачи время. В теории это казалось очень нужной и удобной игрушкой, на деле же оказалось, что плагин был выпилен для старой версии redmine и с trunk-версией работать по полной программе отказался. Худо-бедно он иногда стартовал какие-то таймеры, иногда присылал какие-то уведомления, от полученных команд иногда впадал в ступор и потом долго игнорировал собеседника, в общем вёл себя непозволительно загадочно и непростительно таинственно, но скиллов для исправления обнаруженных проблем мне не хватало, а автор на открытые тикеты особо не реагировал. Мыши плакали, кололись и продолжали есть кактус до одного смешного стечения обстоятельств: я находился в другом городе, бессовестно тратил отпускное время на прогулки, осмотры достопримечательностей и дивных пейзажей, внезапно получил входящий звонок от коллег. Слёзно просили выручать – что-то мол случилось, трах-бах-тарарах …и всё, нет у нас больше redmine. Немного порассуждав вслух, источник проблемы вроде бы вычислили, каким-то временным образом проблему по телефону решили, но в тот же вечер, добравшись до интернета, плагин я без сожалений выкинул. Случилось следующее — при старте redmine, плагин коннектился к jabber-серверу, а уж затем поднимался сам редмайн, но в тот роковой момент соединение с интернетом пропало, от чего случился обширный exception и redmine умер не приходя в сознание.
Тогда стало понятно, что схема со злобным плагином не работает и уведомления надо рассылать внешним по отношению к redmine решением (здесь знатоки rails могли бы долго возражать, но уже поздно). Параллельно с этой проблемой существовали другие. Cкрипт, о котором уже упомянул выше, работал прямо скажем неэффективно. Во-первых он соединялся с xmpp-сервером после каждого коммита, порой делал это долго, порой это у него не получалось, порой сообщения не доставлялись адресату, даже если соединение с сервером было успешным. Поэтому рассылку уведомлений сразу после коммита пришлось разбить на два шага: 1) положить в очередь сообщения для адресатов 2) забрать уведомление из очереди и разослать, после подтверждения доставки удалить его из очереди. Теперь второй скрипт запускался периодически (не после коммита) рассылал уведомления, удалял их из очереди (подтверждения о получении я реализовать не смог). По-прежнему оставалась проблема с пропадающими сообщениями. Немного покопавшись в недрах протокола я обнаружил что клиент получателя, сервер получателя или мой xmpp-сервер при возникновении ошибки возвращают моё сообщение но с типом error: это значило, что периодический запуск «рассылатора-уведомлятора» не подходит — надо держать постоянное соединение с сервером и должным образом обрабатывать входящие сообщения. Так «в муках» родился прототип бота webstatus-а, а с ним и рабочая реализация механизма уведомлений по xmpp. Первоначально это был скрипт на php, который при запуске подключался к jabber-серверу, периодически дёргал mysql запросом на получение новых сообщений и рассылал их, помечал как отправленные, если потом возвращались ошибки – вновь отмечал сообщения как непрочитанные. В mysql-таблицу сообщения попадали от разных источников – от post-commit хука в svn, от различных скриптов, которые запускаются cron-ом и собирают необходимые нам данные.
Таким образом прикрутить это решение к redmine стало просто делом техники — требовалось лишь сделать «триггеры» в нужных моделях, которые бы добавляли новые записи в таблицу с очередью сообщений для xmpp-бота. Уже позднее php-решение было переписано на модной нынче node-платформе. Потребовалась лишь прослойка в виде dbslayer для того чтобы соединить node и mysql.
Теперь всё выглядит следующим образом:
- Сообщения от разных источников попадают в mysql (например :after_save в issue модели редмайна, post-commit хук в svn и т.д.)
- Jabber-бот (на node) периодически делает запрос в mysql (через dbslayer) вида
select msg, recipient from msg where recipient in (cписок тех, кто сейчас в онлайне)
, если получен непустой результат, то сообщения отправляет адресату и отмечает их прочитанными. - Если сообщение вернулось с ошибкой – бот отмечает его непрочитанным, а адресата на некоторое время отправляет «на скамейку запасных» (чтобы не долбить его повторяющимися запросами)
- Бот поддерживается на плаву с помощью supervisord (случаются ошибки, как правило сетевые, которые не удаётся поймать стандартными try-catch в коде бота, после некоторых попыток обработать все возможные проблемы я пришёл к выводу, что проще «упасть и товарищи поднимут» нежели пытаться «любой ценой устоять» — всё-таки данные не настолько критичные и безвозратная потеря сообщения терпима.
Тех, кто дочитал до этого места и всё ещё жаждет получить ссылку «скачать» мне придётся огорчить — описанный код сильно заточен под наши конкретные нужды и планов его публикации не было, поэтому redmine-зависимая часть кода просто на-тяп-ляплена посреди моделей самого редмайна безо всякой попытки вынести эти части в отдельный плагин, node-часть тоже не обошлась без влезания в «чужие» библиотеки. А это всё значит лишь одно: plug-n-play решения у меня нет. Но в комментариях вы можете попробовать наладить конструктивный диалог и мы совместными усилиями создадим работающий у вас плагин, с чаем и шахматистками. Вас это интересует?
ДА!
Очень даже интересует, учитывая то, что выше описанный плагин не работает, а идея довольно таки интересная.
“Плагин” пока в процессе “выковыривания”, потихоньку избавляюсь от совсем уж “лишних” зависимостей (пока это supervisord и dbslayer). Делаю это неспешно, но как только появится нечто, что можно будет поставить на “голый” redmine я отпишусь об этом.
Как успехи то? Есть ли шанс дождаться сего чуда, а то не терпится опробовать )
Успехи хуже некуда, пару месяцев назад безвременно ушёл из жизни ноутбук, на котором неспешно велось много “проектиков”…так что каких-то результатов ждать, видимо, не стоит…