Redmine
Трекеры задач · издатель buff · версия 1.0.4
Вопросы и ответы прямо в задачах Redmine — в трекере, который у вас уже стоит и никуда не переезжает.
Ответ приходит комментарием в ту же задачу. Форма настройки строится по схеме, которую интеграция объявляет о себе. Подключение работает: свой процесс, свой набор инструментов, свой разрешённый адрес. Проверка связи говорит не «ок», а под какой учётной записью вошли и сколько проектов в области. Что интеграция получит, видно в каталоге коннектора до установки.
Нажмите на снимок, чтобы открыть его целиком. Все снимки — с работающей установки.
Обзор
Интеграция связывает Buff с вашим Redmine изнутри вашей же сети. Команда продолжает работать там, где привыкла: в задаче. Buff читает задачу вместе с обсуждением, отвечает комментарием туда же и, если попросили, заводит задачу разработки со ссылкой обратно. Код при этом берётся из ваших репозиториев — они подключаются к Buff отдельно, как источник кода.
Сценарии
Ситуации, ради которых его ставят.
Вопрос по коду, не выходя из задачи
Тестировщик завёл задачу «экспорт в CSV ломается на кириллице» и не знает, где копать. Разработчик занят, а ответ нужен сегодня.
Результат. Он упоминает бота в комментарии. Через несколько минут в задаче лежит разбор: где формируется выгрузка, почему теряется кодировка и что придётся менять. Никто не переключался в другой интерфейс.
Задача разработки из обсуждения
В задаче двадцать комментариев, половина требований появилась по ходу, и переписывать постановку заново никому не хочется.
Результат. Buff читает задачу целиком, вместе с журналом, и заводит по ней черновик задачи разработки. Ссылка возвращается комментарием, так что Redmine остаётся единственным местом, куда смотрит команда.
Это уже было — найти, где именно
Пришла задача, подозрительно похожая на прошлогоднюю. Искать вручную по всем проектам долго.
Результат. Интеграция ищет по отмеченным проектам и приносит связанные задачи: дубликаты, прошлые обращения по той же подсистеме, задачи, на которые опирается текущая — со ссылками.
Ответ там, где его ждут
Заказчик задачи не заходит в интерфейс Buff и не собирается. Ему нужен ответ в задаче, которую он открыл.
Результат. Готовый разбор или ссылка на задачу разработки приходит комментарием в исходную задачу. Единственный инструмент интеграции, который что-то пишет, — и он недоступен на стадиях, где модель только читает.
Примеры
Что написать и что придёт в ответ. Обращение к боту задаётся в настройках подключения — здесь это «@buff».
@buff, разберись, почему при экспорте в CSV ломается кириллица
комментарий в самой задаче
инструмент:
get_issueПрочитал задачу целиком, вместе с обсуждением, и разобрал по коду. Выгрузка собирается в ExportService.buildCsv, файл отдаётся без BOM и с заголовком text/csv без charset — Excel в Windows читает такой файл в cp1251. Разбор с местами в коде приложил документом и продублировал ссылкой сюда.
/research откуда берётся задержка в отчёте
комментарий в задаче — так запускается глубокое исследование
инструмент:
get_issueСлово после обращения выбирает работу: без него — короткий ответ, «research» — глубокое исследование с документом, «task» — черновик задачи разработки. Привычная команда через слэш тоже работает.
@buff, найди задачи про кеширование каталога
комментарий в любой задаче отмеченного проекта
инструмент:
search_issuesНашёл 4 задачи по кешированию: • catalog#218 «Кеш каталога не сбрасывается после смены цены» — закрыта • catalog#341 «Пустые ответы первые 30 секунд после деплоя» — закрыта, прогрев кеша • catalog#402 «Дубли в выдаче после инвалидации» — открыта, похожа на текущую • ops#77 «Redis выедает память на выгрузках» — открыта, обсуждение про TTL
@buff, что уже обсуждали в этой задаче?
комментарий в задаче с длинной перепиской
инструмент:
get_issueКраткая выжимка обсуждения: что просили изначально, какие требования добавились по ходу и в каком комментарии, о чём договорились и что осталось нерешённым. Полезно, когда задаче полгода и в её журнале тридцать записей.
Что умеет
Читает задачу целиком, а не заголовок
get_issue отдаёт модели описание и весь журнал задачи. Это то, из чего складывается настоящая постановка: в заголовке «не работает поиск», а в третьем комментарии — что именно и на каких данных. Инструмент только читает.
Ищет по отмеченным проектам
search_issues ходит по проектам, которые вы отметили, и находит связанные задачи — дубликаты, прошлые обращения по той же подсистеме, задачи, на которые опирается текущая. Тоже только чтение.
Отвечает в той же задаче
add_comment пишет ответ в исходную задачу: разбор вопроса или ссылку на задачу разработки. Это единственный инструмент интеграции, который что-то меняет, — и он недоступен на стадиях, где модель только читает. Проверяет это коннектор у себя.
Узнаёт свои же ответы
В журнале Redmine у записи есть только отображаемое имя автора — логина там нет вовсе. Интеграция знает, как её зовут, и поэтому не принимает собственный ответ за новый вопрос. Мелочь, без которой бот отвечал бы сам себе бесконечно.
Берётся за работу только по обращению
Смена статуса, приоритета или исполнителя не запускает ничего: их делают правила и массовые правки, и работа, которую никто не заказывал, всё равно была бы оплачена. Назначение задачи на учётную запись бота — это обращение, но и оно бывает автоматическим, поэтому включается отдельной настройкой. Список отмеченных проектов и есть контроль доступа: внутри них позвать бота может любой участник, за их пределами — никто.
Как пользоваться
Всё происходит на машине, где стоит коннектор. Открывать доступ к вашей сети снаружи не нужно ни на одном шаге.
Шаг 1
Установка занимает одно нажатие
Откройте раздел «Маркетплейс» на локальной странице коннектора. До установки видно, что интеграция получит: адреса, по которым она сможет ходить, какие учётные данные попросит и сколько инструментов увидит модель. Коннектор скачивает подписанный бандл из нашего реестра и проверяет подпись до того, как что-то запишет на диск.
КоннекторГраницы доступа видны в каталоге до установки. Шаг 2
Настройка — адрес, ключ и список проектов
Нужен адрес вашего Redmine, ключ API учётной записи бота и идентификаторы проектов — то, что стоит в адресе проекта. Ключ Redmine принимает только в своём заголовке, и коннектор подставляет его сам: интеграция ключа не видит. В самом Redmine не забудьте включить REST API (Администрирование → Настройки → Аутентификация).
КоннекторФорма настройки строится по схеме интеграции. Шаг 3
Заведите боту отдельную учётную запись
Дайте ей участие только в тех проектах, где бот должен отвечать: права учётной записи — это внешняя граница, а список отмеченных проектов — внутренняя. Роли с правом просмотра и комментирования достаточно; администратором бот быть не должен.
Шаг 4
Код подключается отдельно
Redmine — трекер задач, репозиториев он для нас не отдаёт. Чтобы бот отвечал по вашему коду, репозитории подключаются к Buff как источник кода — тем же коннектором, в разделе «Репозитории». Одно без другого работает: бот сможет читать задачи и отвечать в них, просто без разбора по коду.
Шаг 5
То же самое из командной строки
Установка без графики равноправна, а не запасной вариант: `connector install redmine`, затем `connector instance add redmine --config base_url=… --config projects=catalog`. На сервере без иксов вы делаете то же самое и получаете тот же результат.
Шаг 6
События приходят сами
После настройки ничего запускать не нужно: интеграция сама следит за отмеченными проектами и приносит обращения. Портов открывать не требуется — Redmine своих вызовов не шлёт, и всё держится на опросе, который идёт только наружу из вашей сети.
КоннекторКаждое подключение — отдельный процесс со своим набором инструментов.
Границы доступа
То же самое коннектор показывает на вашей машине до установки. Список берётся из подписанного каталога, а не написан здесь руками.
Ходит наружу
только по адресам из полей base_url
Учётные данные
api — значения остаются в коннекторе, интеграция их не видит
Вебхуки
не принимает
| Инструмент | Что делает | Доступ |
|---|---|---|
| search_issues | Найти задачи по тексту — когда упомянут номер или нужен контекст из трекера | только чтение |
| get_issue | Прочитать задачу с обсуждением — когда нужны требования или ход обсуждения | только чтение |
| add_comment | Написать комментарий в задачу | пишет |
Интеграция работает отдельным процессом под собственным пользователем операционной системы: она не видит ключа коннектора, не читает файлы других подключений и не может выйти в сеть мимо коннектора. Подробнее — в разделе о безопасности.
Требования
- Redmine с включённым REST API (Администрирование → Настройки → Аутентификация → «Включить REST-веб-сервис»).
- Ключ API учётной записи бота, участвующей в нужных проектах (администратором бот быть не должен).
- Сетевой доступ от машины с коннектором до Redmine — наружу из вашей сети ничего открывать не нужно.
- Коннектор, запущенный с правом заводить отдельного пользователя ОС для интеграции (root или CAP_SETUID).
- Разбор по коду требует, чтобы репозитории были подключены к Buff отдельно: Redmine репозиториев не отдаёт.
Вопросы
- Ключ Redmine уходит к вам в облако?
- Нет. Он хранится на машине с коннектором и не покидает её. Интеграция тоже его не видит: коннектор подставляет ключ в исходящий запрос сам — в тот заголовок, который Redmine ожидает.
- Может ли интеграция ходить куда-то, кроме нашего Redmine?
- Нет. Наружу она ходит только через коннектор и только по адресу, выведенному из поля настройки, и только по путям API. Всё остальное коннектор отклоняет.
- Бот сможет писать в проекты, которые мы не отмечали?
- Нет. Список отмеченных проектов ограничивает и чтение, и запись: обращение из неотмеченного проекта не запускает работу, а попытка ответить туда отклоняется самим коннектором. Права учётной записи бота — вторая, независимая граница.
- Нужно ли открывать порт?
- Нет. Redmine своих вызовов не присылает, поэтому интеграция работает опросом: коннектор ходит наружу сам, и никаких входящих соединений не требуется.
- Может ли бот начать работу сам, без обращения?
- Нет. Смена статуса, приоритета или исполнителя не считается обращением: их делают правила и массовые правки, и это привело бы к работе, которую никто не заказывал, но за которую выставлен счёт. Назначение задачи боту — обращение, но оно тоже бывает автоматическим, поэтому по умолчанию выключено.
- Может ли модель случайно написать в задачу на этапе анализа?
- Нет. Инструменты доступны только на читающих стадиях и только те, что помечены как читающие. add_comment туда не попадает, и проверяет это коннектор у себя, а не мы у себя.
- А если бот ответит сам себе?
- Не ответит. В журнале Redmine у записи есть только отображаемое имя автора, и интеграция узнаёт по нему свои же ответы. Это единственный способ отличить их — логина в журнале нет.
- Как быстро приходит ответ?
- Обращение принимается в пределах интервала опроса — это секунды-десятки секунд; сам ответ занимает столько, сколько занимает работа.
Дальше
Подключить Redmine
Поставьте коннектор в своей сети, откройте его локальную страницу и установите интеграцию из каталога. Пересобирать ничего не нужно.
Юрлицам и ИП — оплата переводом по реквизитам и закрывающие документы