Gitea
Трекеры задач · издатель buff · версия 1.0.5
Вопросы и ответы прямо в задачах и pull request вашей Gitea или Forgejo — там, где команда уже обсуждает код.
Ответ приходит комментарием в тот же pull request и разобран по его ветке. В задаче — то же самое: спросили в комментарии, ответ пришёл туда же. Форма настройки строится по схеме, которую интеграция объявляет о себе. Подключение работает: свой процесс, свой набор инструментов, свой разрешённый адрес. Проверка связи говорит не «ок», а версию Gitea, учётную запись и число репозиториев в области. Что интеграция получит, видно в каталоге коннектора до установки.
Нажмите на снимок, чтобы открыть его целиком. Все снимки — с работающей установки.
Обзор
Интеграция связывает Buff с вашей Gitea изнутри вашей же сети. Разработчик пишет боту там, где и так идёт обсуждение: в задаче или под pull request. Buff читает обсуждение, отвечает комментарием в тот же тред и — если попросили — заводит задачу разработки со ссылкой обратно. Вопрос, заданный в pull request, разбирается по коду ИМЕННО этой ветки, а не по основной.
Сценарии
Ситуации, ради которых его ставят.
Вопрос по коду прямо под pull request
Ревьюер открыл чужой pull request и не понимает, зачем понадобилась правка в трёх местах сразу. Спрашивать автора — ждать до завтра, читать всю ветку самому — полдня.
Результат. Он пишет боту в комментарии под pull request. Ответ приходит туда же и разобран по коду ЭТОЙ ветки: что меняется, почему связаны три места и на что это влияет. Ревью продолжается в том же окне.
Задача разработки из обсуждения
В задаче двадцать комментариев, половина требований появилась по ходу обсуждения, и переписывать постановку заново никому не хочется.
Результат. Buff читает задачу целиком, вместе с обсуждением, и заводит по ней черновик задачи разработки. Ссылка возвращается комментарием, так что трекер остаётся единственным местом, куда смотрит команда.
Это уже было — найти, где именно
Пришла задача, подозрительно похожая на прошлогоднюю. Искать вручную по всем репозиториям долго, а помнит её только тот, кто уволился.
Результат. Интеграция ищет по отмеченным репозиториям и приносит связанные задачи и pull request: дубликаты, прошлые обращения по той же подсистеме, изменения, на которые опирается текущее — со ссылками.
Разбор изменений без переключения контекста
Pull request на восемьсот строк, а вопрос простой: что здесь меняется по существу и чего не хватает.
Результат. Бот читает изменения одним diff и отвечает по делу — что меняется, что осталось недоделанным, где тесты не покрывают новую ветку кода. Ответ лежит в самом pull request, рядом с изменениями.
Примеры
Что написать и что придёт в ответ. Обращение к боту задаётся в настройках подключения — здесь это «@buff».
@buff перечисли, что меняет этот pull request, и чего в нём не хватает
комментарий под pull request
инструмент:
get_pull_diffМеняет три места: разбор CSV (добавлен BOM), заголовок ответа (появился charset=utf-8) и тест выгрузки. Не хватает: выгрузка из планировщика идёт другим путём и BOM там не добавляется — файл из ночной задачи откроется так же криво.
@buff research разберись, откуда берётся задержка в отчёте
комментарий в задаче — так запускается глубокое исследование
инструмент:
get_issueСлово после обращения выбирает работу: без него — короткий ответ, «research» — глубокое исследование с документом, «task» — черновик задачи разработки. Привычная команда через слэш тоже работает: /research и /task.
/ask что уже обсуждали в этой задаче?
комментарий в задаче с длинной перепиской
инструмент:
get_issueКраткая выжимка обсуждения: что просили изначально, какие требования добавились по ходу и в каком комментарии, о чём договорились и что осталось нерешённым. Полезно, когда задаче полгода и в ней тридцать комментариев.
@buff найди задачи про кеширование каталога
комментарий в любой задаче отмеченного репозитория
инструмент:
search_issuesНашёл 4 обсуждения по кешированию: • acme/api#218 «Кеш каталога не сбрасывается после смены цены» — закрыт • acme/api#341 «Пустые ответы первые 30 секунд после деплоя» — закрыт, прогрев кеша • acme/api#402 «Дубли в выдаче после инвалидации» — открыт, похоже на текущее • acme/web#77 «Redis выедает память на выгрузках» — открыт, обсуждение про TTL
Что умеет
Отвечает по ветке того pull request, в котором спросили
Вопрос, заданный под pull request, — это вопрос о коде ЭТОГО pull request. Интеграция передаёт вместе с обращением репозиторий и ветку, платформа подтягивает свежую копию репозитория и разбирает вопрос на его ветке, а не на основной. Ответ по основной ветке выглядел бы уверенно и был бы про другой код.
Читает задачу или pull request целиком
get_issue отдаёт модели описание и всё обсуждение — то, из чего складывается настоящая постановка: в заголовке «не работает поиск», а в третьем комментарии — что именно и на каких данных. get_pull_diff показывает изменения одним diff. Оба инструмента только читают.
Ищет по отмеченным репозиториям
search_issues ходит по репозиториям, которые вы отметили, и находит связанные задачи и pull request — дубликаты, прошлые обращения по той же подсистеме, изменения, на которые опирается текущее. Тоже только чтение.
Отвечает в том же треде
add_comment пишет ответ туда, где спросили: в задачу или в pull request. Это единственный инструмент интеграции, который что-то меняет, — и он недоступен на стадиях, где модель только читает. Проверяет это коннектор у себя.
Слышит и обращение, и привычную команду
Работает и упоминание — «@buff, посмотри», — и команда через слэш, привычная в Gitea: /ask, /research, /task. Без команды бот отвечает на вопрос. Опрос идёт по расписанию и не требует открытых портов; если Gitea есть куда стучаться, вызов доходит сразу — коннектор принимает его, проверяет секрет и подпись и отдаёт интеграции уже проверенное тело.
Берётся за работу только по обращению
Метка или смена поля не запускают ничего: их ставят правила, массовые правки и автоматика самого трекера, и работа, которую никто не заказывал, всё равно была бы оплачена. Назначение задачи на учётную запись бота — это обращение, но и оно бывает автоматическим, поэтому включается отдельной настройкой. Список отмеченных репозиториев и есть контроль доступа: внутри них позвать бота может любой участник, за их пределами — никто, и писать туда интеграция тоже не станет.
Как пользоваться
Всё происходит на машине, где стоит коннектор. Открывать доступ к вашей сети снаружи не нужно ни на одном шаге.
Шаг 1
Установка занимает одно нажатие
Откройте раздел «Маркетплейс» на локальной странице коннектора. До установки видно, что интеграция получит: адреса, по которым она сможет ходить, какие учётные данные попросит, будет ли принимать вызовы и сколько инструментов увидит модель. Коннектор скачивает подписанный бандл из нашего реестра и проверяет подпись до того, как что-то запишет на диск.
КоннекторГраницы доступа видны в каталоге до установки. Шаг 2
Настройка — адрес, токен и список репозиториев
Нужен адрес вашей Gitea, токен учётной записи бота и репозитории в формате владелец/репозиторий. Форма построена по схеме, которую интеграция объявляет о себе. Токен остаётся в коннекторе: интеграция его не видит, коннектор сам подставляет его в исходящие запросы.
КоннекторФорма настройки строится по схеме интеграции. Шаг 3
Заведите боту отдельную учётную запись
Дайте ей доступ только к тем репозиториям, где бот должен отвечать: права учётной записи — это внешняя граница, а список отмеченных репозиториев — внутренняя. Токен достаточно выдать с правами на репозитории и задачи; администратором бот быть не должен.
Шаг 4
То же самое из командной строки
Установка без графики равноправна, а не запасной вариант: `connector install gitea`, затем `connector instance add gitea --config base_url=… --config repos=acme/api`. На сервере без иксов вы делаете то же самое и получаете тот же результат.
Шаг 5
События приходят сами
После настройки ничего запускать не нужно: интеграция сама следит за отмеченными репозиториями. Хотите быстрее — включите приём событий у коннектора: адрес указывается один раз на всю машину, а у подключения остаётся только выключатель. Ссылку для вебхука Gitea коннектор выдаёт сам; секрет внутри неё он генерирует и не показывает. Подпись Gitea коннектор проверяет — во всех трёх видах, которые она присылает.
КоннекторКаждое подключение — отдельный процесс со своим набором инструментов. Шаг 6
Несколько серверов — несколько подключений
Две Gitea или одна Gitea для разных команд — это два подключения одной интеграции. У каждого свои учётные данные, свой список репозиториев, свой проект разработки и свой процесс под отдельным пользователем ОС. Переименование ничего не ломает: подключение живёт под идентификатором, а не под названием.
Границы доступа
То же самое коннектор показывает на вашей машине до установки. Список берётся из подписанного каталога, а не написан здесь руками.
Ходит наружу
только по адресам из полей base_url
Учётные данные
api — значения остаются в коннекторе, интеграция их не видит
Вебхуки
deliver — порт открываете вы, по желанию
| Инструмент | Что делает | Доступ |
|---|---|---|
| search_issues | Найти задачи и pull request по тексту — когда упомянут номер или нужен контекст из трекера | только чтение |
| get_issue | Прочитать задачу или pull request с обсуждением — когда нужны требования или ход обсуждения | только чтение |
| get_pull_diff | Прочитать изменения pull request одним diff | только чтение |
| add_comment | Написать комментарий в задачу или pull request | пишет |
Интеграция работает отдельным процессом под собственным пользователем операционной системы: она не видит ключа коннектора, не читает файлы других подключений и не может выйти в сеть мимо коннектора. Подробнее — в разделе о безопасности.
Требования
- Gitea 1.20 или новее, либо совместимая Forgejo. Подходит и self-hosted, и сервер в вашем контуре.
- Токен учётной записи бота с правами на репозитории и задачи (администратором бот быть не должен).
- Сетевой доступ от машины с коннектором до Gitea — наружу из вашей сети ничего открывать не нужно.
- Коннектор, запущенный с правом заводить отдельного пользователя ОС для интеграции (root или CAP_SETUID).
- Чтобы вопрос из pull request разбирался по его ветке, репозиторий должен быть подключён к Buff как источник кода. Иначе бот ответит по основной ветке и скажет об этом в самом обсуждении.
Вопросы
- Токен Gitea уходит к вам в облако?
- Нет. Он хранится на машине с коннектором и не покидает её. Интеграция тоже его не видит: коннектор подставляет токен в исходящий запрос сам.
- Может ли интеграция ходить куда-то, кроме нашей Gitea?
- Нет. Наружу она ходит только через коннектор и только по адресам, выведенным из полей настройки, — то есть по адресу вашей Gitea, и только по путям API. Всё остальное коннектор отклоняет.
- Бот сможет писать в репозитории, которые мы не отмечали?
- Нет. Список отмеченных репозиториев ограничивает и чтение, и запись: обращение из неотмеченного репозитория не запускает работу, а попытка ответить туда отклоняется самим коннектором. Права учётной записи бота — вторая, независимая граница.
- Вопрос в pull request разбирается по его ветке или по основной?
- По ветке этого pull request. Обращение приносит репозиторий и ветку, платформа подтягивает свежую копию репозитория и разбирает вопрос на ней. Если репозиторий не подключён к Buff как источник кода, бот ответит по основной ветке и честно скажет об этом в ответе — вместо того чтобы выдать разбор чужого кода за ответ на ваш вопрос.
- Как обратиться к боту?
- Упоминанием — «@buff, посмотри» — или командой через слэш: /ask, /research, /task. Без команды бот просто отвечает на вопрос. Обе формы работают и в задаче, и в pull request.
- Может ли бот начать работу сам, без обращения?
- Нет. Метки и смена полей не считаются обращением: их ставят правила и массовые правки, и это привело бы к работе, которую никто не заказывал, но за которую выставлен счёт. Назначение задачи боту — обращение, но оно тоже бывает автоматическим, поэтому по умолчанию выключено.
- Может ли модель случайно написать в задачу на этапе анализа?
- Нет. Инструменты доступны только на читающих стадиях и только те, что помечены как читающие. add_comment туда не попадает, и проверяет это коннектор у себя, а не мы у себя.
- Нужно ли открывать порт для вебхуков?
- Не обязательно. Опрос работает всегда и портов не требует; приём вызовов — ускорение для тех, кому есть куда его направить. Порт открывает коннектор, один на все подключения; сами интеграции портов не открывают вовсе.
- Forgejo подойдёт?
- Да. Forgejo — форк Gitea с тем же API, и интеграция работает с ней так же. Если версия окажется несовместимой, проверка связи скажет об этом прямо при настройке.
Дальше
Подключить Gitea
Поставьте коннектор в своей сети, откройте его локальную страницу и установите интеграцию из каталога. Пересобирать ничего не нужно.
Юрлицам и ИП — оплата переводом по реквизитам и закрывающие документы