Redmine – прекрасная система для управления проектами и отслеживания ошибок. Однако (из моего личного опыта использования), она не способна выстроить в работающем коллективе самоорганизующуюся систему контроля ошибок. Разработчики бывают слишком заняты для того, чтобы отслеживать все комментарии, относящиеся к их задачам; с другой стороны автор, создавший ту или иную задачу, точно так же редко в неё заглядывает. В случаях, когда задача поставлена некорректно или должна быть уточнена, диалог между исполнителем и автором может затянуться, т. к. обсуждение ведётся вяло. Из-за этого трекер-лист превращается в помойку неактуальных задач. Становится проще решить вопрос напрямую, не прибегая к Redmine. Эффективность такой системы мала.
Стоит сказать, что меня интересует именно самоорганизующаяся система. Наверняка можно нанять некоторого специалиста, который будет пинать разработчиков, чтобы они заглядывали в трекер почаще, обзванивать пользователей и т. д. Но в реалиях небольших компаний это роскошь. Потому, как мне кажется, эту проблему нужно решать через некий механизм оповещений.
Сходу проблема может быть решена так:
- Redmine умеет рассылать оповещения на почту. В принципе то, что нужно, но имеет ряд недостатков: во-первых, никто не будет проверять почту каждые пять минут; во-вторых, данная функция оповещения может быть отключена самим пользователем; в случае отсутствия корпоративной почты такие письма-оповещения спешат в секцию спама.
- Расширением для IDE, например mylyn для Eclipse. К сожалению, решает проблему только с одного конца: у обычных пользователей нет никаких IDE. Зато для разработчиков дает широчайшие возможности для работы с Redmine прямиком из IDE. Наверное, это даже лучший вариант (для разработчиков), если компания способна развернуть рабочее место с предустановленной IDE и настроенным расширением.
- Оповещения через jabber или icq.
Для Redmine существует занятный jabber-бот orangutan. Это амбициозный проект, целью которого является организация работы с Redmine через jabber-протокол. В идеальном мире вы можете: закрывать, создавать и комментировать задачи просто отправляя команды-сообщения на человеческом языке. Но это в идеальном мире. А в реальном возникают сложности в настройке, команды фиксированы, о человеческом языке речи не идет. Кроме того для работы бота на Redmine нужно накатить плагин, писаный для какой-то лохматой версии. И самый главный минус: поддержка только английского языка.
К сожалению, я не нашел других возможностей организации jabber-оповещений для Redmine. Пришлось сотворить свой сервис оповещений.
Сервис оповещений «send2me»
Как я уже писал ранее, Redmine умеет рассылать почтовые оповещения об изменениях в задачах. Воспользовавшись этой возможностью можно реализовать отправку jabber-оповещений путем прямой пересылки почтовых сообщений списку jabber-адресов. На основе этой идеи появился send2me.org.
После регистрации каждый пользователь получает персональный почтовый ящик, например «mail@send2me.org». Любое сообщение, поступившее на этот электронный почтовый ящик, пересылается списку jabber-контактов, согласно созданным правилам. Сервис предоставляет простой интерфейс описания правил отбора сообщений для рассылки. Правила описываются блоками условных переходов, регулярными выражениями и таблицей маршрутизации. Три этих составляющих позволяют описать сколь угодно сложное правило отправки сообщений. Тем не менее, создание правила для рассылки оповещений от Redmine является тривиальной задачей, благодаря встроенным шаблонам.
Итак, настроим jabber-оповещения для Redmine:
1. Регистрируемся на send2me.org и получаем персональный почтовый ящик, например «mail@send2me.org».
2. В Redmine создаем пользователя, который будет слушать все оповещения, а в качестве его электронного адреса указываем «mail@send2me.org». Таким образом, мы добиваемся того, что все изменения в задачах будут отправляться на указанную почту.
3. Теперь нам нужно создать правило обработки сообщений Redmine. Для этого заходим под своим пользователем на send2me.org и жмем на кнопку «Добавить» в разделе «Правила».
В форме редактирования правила указываем шаблон «Redmine».
Пройдемся по пунктам, которые нужно изменить.
- В первом блоке (красная цифра «1» на изображении) мы отбрасываем все сообщения, которые приходят не от Redmine. Делается это регулярным выражением:
$header{'X-Redmine-Host'} =~ /^yourredminehost.com$/
Соответственно, вместо "yourredminehost.com" следует вписать хост вашего Redmine.
- Во втором блоке мы отбрасываем все сообщения не из нашего проекта. Используется регулярное выражение:
$header{'X-Redmine-Project'} =~ /^identifier$/
где "identifier" это идентификатор проекта в Redmine. Этот блок опциональный – если его удалить, то будут приниматься сообщения от всех проектов.
- Ну и наконец, в третьем блоке нужно заполнить таблицу соответствий пользователей Redmine и их jabber-контактов.
Замечание: для определения получателей сообщения используются заголовки письма, которые генерирует Redmine.
( $header{'X-Redmine-Issue-Author'}, $header{'X-Redmine-Issue-Assignee'}, split(';', $header{'X-Redmine-Watchers'} ))
К сожалению Redmine не добавляет в заголовок письма наблюдателей задачи. Поэтому «из коробки» оповещения будут приходить только авторам задач и назначенным исполнителям. Для определения наблюдателей используется дополнительный заголовок "X-Redmine-Watchers". Чтобы он работал, необходимо поставить простенький плагин для Redmine (он не требует ни миграции, ни каких либо манипуляций с настройкой Redmine).
На этом процедура настройки jabber-оповещений Redmine заканчивается. Далее для тех, кому интересно, я опишу архитектуру сервиса send2me.org
Архитектура сервиса оповещений
На рисунке представлена принципиальная схема организации такого сервиса.
Любое письмо, поступившее на электронный почтовый ящик, обрабатывается следующим образом:
- Postfix – принимает полученное сообщение и перенаправляет его в именованный канал (named pipe). Postfix сконфигурирован таким образом, что перенаправляет в пайп только сообщения от тех пользователей, для которых есть запись в базе данных send2me.org (т.е. для зарегистрированных пользователей). Остальные сообщения удаляются.
- Rule processor (обработчик правил) – извлекает сообщение из именованного канала и применяет к нему набор пользовательских правил. Если сообщение не отбрасывается согласно правилам, то оно подготавливается для отправки jabber-контактам и перенаправляется в следующий именованный канал.
- Ejabberd module (bot) – извлекает сообщение из именованного канала и отправляет его.
Отдельным звеном является web crud, написанный на Dancer и предназначенный для создания и редактирования пользовательских правил.
Вложения писем сервисом не обрабатываются, а вырезаются при получении с помощью renattach.
Мне сложно оценить производительность такой архитектуры: postfix и ejabberd являются широко известными высококачественными продуктами. Полагаю, узким звеном являются части системы, написанные мною на perl. Думаю, довольно быстро хабраэффект свалит мой нищебродский сервер (1Ghz & 512MB), но на обслуживание реально заинтересованных пользователей его вполне хватит.
Автор: Caiiiycuk