В рубрике DOU Labsмы приглашаем IT-компании делиться опытом собственных интересных разработок и внутренних технологических инициатив. Вопросы и заявки на участие присылайте на editors@dou.ua.
Redmine Estimates — это плагин к трекеру Redmine, который упрощает жизнь и экономит время менеджеров проектов и менеджеров управляющих технической поддержкой.
Идея
Идея плагина возникла, когда на задачах технической поддержки мы в Evergreen постоянно сталкивались с тем, что оценку должны давать несколько специалистов — например, дизайнер, front-end разработчик и back-end разработчик, и в процессе выполнения задачи и поступления дополнительных пожеланий от заказчика возникает необходимость в дооценке. А дальше при согласовании месячного отчета начинают возникать вопросы, почему задача, оцененная в 2 часа, по факту заняла 10 часов, и эти проблемы мы можем увидеть только в конце месяца.
Как удобно согласовывать оценки в задачах и дооценивать их по ходу выполнения, чтобы это было просто и понятно и команде, и клиенту?
Первая же идея, которая пришла в голову, — ограничить одну задачу техподдержки одним видом деятельности, и каждое новое пожелание вести отдельной задачей, всё это связывать через подзадачи. Но такая реализация в Redmine крайне неудобная, порождает сложности и необходимость контролировать, что у тебя происходит в 10 задачах вместо одной.
Мы видели, что модули, которые позволяют красиво решить задачу оценки по видам работ и дооценки по ходу выполнения, есть в других задачниках и системах управления проектами, но ничего подобного для Redmine найти не смогли.
В итоге всё свелось к тому, что до разработки Redmine Estimates мы просто вели всё в комментариях, примерно так, и это было крайне неудобно:
Реализация
Как ставили задачу по разработке Redmine плагина для согласования оценки:
- Оценка теперь, как и затраченное время, дробится на разные виды деятельности. Общее поле «оценка» считается как сумма оценок по всем видам деятельности.
- На странице редактирования оценки список несогласованных позиций оценки:
- Когда мы обновляем задачу или нажимаем «добавить оценку», открывается форма редактирования задачи, в ней добавляется графа согласования оценки.
- Оценки хранятся в базе в отдельной таблице аналогично time_entries (встроенная сущность «Затраченное время» в Redmine).
- При любом обновлении оценок поле «оценка» задачи обновляется как сумма всех оценок, привязанных к этой задаче. Как обновлять — при сохранении, при открытии или как-то еще — вопрос к размышлению.
- Кнопка «Согласовать» в таблице оценок доступна только определенным ролям (менеджер, клиент). Идеальная реализация — сделать в rm отдельное право доступа, чтобы можно было его выставлять в управлении ролями.
- Когда происходит согласование оценки, должно быть видно, кто и когда её согласовал.
- Подтвержденные записи удалять и редактировать не может никто (кроме администратора)!
- После подтверждения даем 1 минуту, в течение которой можно опять нажать кнопку и подтверждение пропадёт, после 1 минуты или если перезагрузил страницу — всё, отменить подтверждение нельзя.
- Если есть несогласованная оценка возле поля оценка появляется иконка warning и надпись «есть несогласованная оценка». Это поле должно быть доступно для фильтра в списке задач.
- Редактировать и удалять записи согласования оценки (неподтвержденные) могут:
- тот, кто её сделал;
- администраторы;
- сделать в Redmine отдельное право доступа, чтобы можно было его выставлять в управлении ролями.
- тот, кто её сделал;
Задача почти год лежала на полке, ожидая своего часа, но, наконец, в июле 2016 года, мы поручили разработку нашему R&D Developer’у. Опыта в разработке под Redmine у нас было мало, у разработчика опыта в Ruby не было вообще.
Не буду долго описывать, как это реализовывалось, мы, похоже, собрали все шишки, какие было можно собрать на этом пути. Но мы это сделали! Плагин назвали Redmine Estimates. Кому интересно, что мы собрали, читайте ниже, кому интересно, что может готовый результат — смело пролистывайте на следующий раздел.
Ключевой сложностью в разработке плагинов для Redmine является достаточно низкое качество документации по коду самого Redmine.
Например, буквально со старта мы столкнулись с тем, что банально не могли поднять окружение. Делали все по www.redmine.org/…dmine/wiki/RedmineInstall. Сначала установили ruby 2.1, долго не хотел устанавливаться DevKit для этого же руби. При установке зависимостей из gem файла не компилился gem json и redcarpet. Перелопатили кучу stackoverflow, ничего не помогало. Потом установили ruby 2.3, DevKit поставился, все зависимости подтянулись и все гемы скомпилились, но после запуска команды bundle exec rake generate_secret_token
, которая указана в документации, вылезла ошибка и опять же пришлось искать ответ на stackoverflow. В общем и целом для того, чтобы поднять окружение, пробовали и Bitnami Redmine Stack 2.6.10, и просто самостоятельно на отдельном сервере. С помощью молотка, зубила и путем дикого перебора таки подняли и начали разработку.
На этом приколы не закончились. Настроили роут `localhost/issues/:id/s/:id/time_entries_estimates`. C добавлением отдельного контроллера возникла проблема с авторизацией. Здесь нужно добавить permissions, но, когда добавляешь, пишет 404. Создали шаблон плагина через bundle exec ruby script/rails generate redmine_plugin
, но не получается настроить вывод стектрейса в браузер, то, что пишут на stackoverflow, не помогло. Сломали развернутый редмайн. Откатили все коммиты, но он не ожил, и отдебажить никак не получается. Просто 500 отдадет и пишет стандартное редмайновское собщение об ошибке. Развернули новый redmine с продакшн средой.
Расковыряли код неслабо, выяснилось, что так просто под копирку сделать модель и контроллер никак не получится. В редмайне плохо реализована MVC модель, контроллер зависит не только от кучи других классов, имеет много примесей
В общем примерно через неделю только от начала этого процесса мы более-менее разобрались, как оно всё завязано и работает, всю необходимую помощь по-прежнему получали на stackoverflow. Дальше пошло всё довольно гладко.
Что Redmine Estimates умеет сейчас
Сейчас плагин умеет накапливать оценки по разным видам деятельности в рамках одной задачи. К каждой оценке можно задать деятельность, оценку в часах и прокомментировать:
Подтвержденные оценки по умолчанию скрываются, но можно посмотреть все оценки, если нажать «Показать подтвержденные оценки»:
Право на подтверждение оценки, редактирование записей оценки выставляется отдельным полем в разделе «Администрирование»:
Если у пользователя не установлено право на редактирование оценки, у него есть 1 минута для того, чтобы изменить оценку, если он ошибся.Если в течение этого времени он не отредактирует оценку — больше возможности отредактировать оценку у него не будет.
В общем списке задач можно вывести поля «Всего часов оценок» и «Всего подтверждено оценок» и использовать их как фильтры:
Планы на ближайшее будущее
В ближайшем будущем планируем доделать то, что не готово в текущем релизе:
- уведомления о подтверждении оценки и соответствующая запись в Journal;
- запрет на редактирование подтвержденных оценок;
- признак «Есть неподтвержденные оценки» и соответствующая иконка warning;
- вычистить код от упоминаний time_entries, на базе которых мы делали плагин.
Где скачать плагин и как установить?
Ссылка на репозиторий GitHub: github.com/…nmikhno/redmine_estimates
Инструкция по установке там же. Полностью Open Source, таким и останется. Разработан и используется у нас в Evergreen для Redmine 2.1, портирован на 3.0, желающие портировать на другие версии Redmine и поучаствовать в разработке и доработке на свободных началах приветствуются.