Discourse GitHub

:discourse2: Краткое описание Discourse GitHub Позволяет сотрудникам назначать значки пользователям на основе их вкладов в GitHub. Также позволяет пользователям создавать Linkback-ссылки, постоянные ссылки (Permalinks) и отображать актуальный статус пул-реквестов (PR) в однобусах.
:open_book: Руководство по установке Этот плагин входит в состав ядра Discourse. Отдельная установка плагина не требуется.

Возможности

Значки GitHub

Назначайте значки своим пользователям на основе их вкладов в GitHub.

Как использовать:
  1. Включите настройку github badges enabled в Настройки > Плагины.
  2. Сгенерируйте токен доступа GitHub и вставьте его в настройку github linkback access token. Инструкции приведены ниже.
  3. Добавьте один или несколько URL-адресов репозиториев GitHub для отслеживания вкладов в настройку сайта github badges repos.
Как работает подсчёт значков:

Значки учитывают коммиты во всех репозиториях, и когда пользователь вносит вклад в несколько репозиториев, все его коммиты суммируются в общий счётчик.

Значки коммитеров:

Значок Требуется коммитов
Бронзовый 1 коммит
Серебряный 25 коммитов
Золотой 1000 коммитов

Прогрессия значков: По мере накопления вкладов пользователя в любом из отслеживаемых репозиториев он автоматически переходит на следующий уровень значков. Например, если пользователь делает коммит в Репозиторий A, а затем в Репозиторий B, оба вклада учитываются в общем счётчике, позволяя ему перейти от Бронзового к Серебряному, а затем к Золотому.


Linkback GitHub

Создавайте ссылку из пул-реквеста (PR) или коммита GitHub обратно в тему Discourse, где она упоминается.

Как использовать:
  1. Включите настройку github linkback enabled в Настройки > Плагины.
  2. Сгенерируйте токен доступа GitHub и вставьте его в настройку github linkback access token. Инструкции приведены ниже.
  3. Наконец, добавьте проекты, в которые вы хотите отправлять посты, в настройку сайта github linkback projects в формате:
    • username/repository для конкретных репозиториев
    • username/* для всех репозиториев определённого пользователя

Постоянные ссылки GitHub (Permalink)

Заменяйте обычные ссылки GitHub на постоянные ссылки (permalinks).

Как использовать:
  1. Включите настройку github permalinks enabled в Настройки > Плагины.

Актуальный статус PR

Отображайте индикаторы актуального статуса для пул-реквестов GitHub в однобусах в постах и сообщениях чата. Статус автоматически обновляется через вебхуки при изменении PR в GitHub.

Типы статуса
Статус Цвет Описание
Черновик Серый PR помечен как черновик
Открыт Серый PR открыт и ожидает проверки
Одобрено Зелёный PR одобрен рецензентами
Запрошены изменения Оранжевый Рецензенты запросили изменения
Слит (Merged) Фиолетовый PR слит в основную ветку
Закрыт Красный PR закрыт без слияния
Как использовать:
Шаг 1: Включение функции

Перейдите в Админ-панель > Настройки > Плагины и установите значение github pr status enabled в true.

Шаг 2: Настройка токенов доступа GitHub

Для получения статуса PR (особенно для частных репозиториев) настройте токены доступа GitHub.

Настройка: github onebox access tokens

Формат:

название_организации|ghp_ваш_токен_здесь
по_умолчанию|ghp_токен_резервный_здесь

Вы можете указать токены для каждой организации, а также токен по_умолчанию, используемый в качестве резервного. Каждая строка должна содержать название_орг|токен, где токен — это Персональный токен доступа GitHub (классический) с областью действия repo.

Пример:

discourse|ghp_xxxxxxxxxxxxxxxxxxxx
my-company|ghp_yyyyyyyyyyyyyyyyyyyy
по_умолчанию|ghp_zzzzzzzzzzzzzzzzzzzzzz
Шаг 3: Настройка вебхуков GitHub (для обновлений в реальном времени)

Чтобы получать автоматические обновления статуса при изменении PR, настройте вебхук в GitHub.

Сгенерируйте секрет вебхука:

openssl rand -hex 32

Установите значение настройки сайта github webhook secret на сгенерированный секрет.

Создайте вебхук в GitHub:

Вы можете создать вебхук на уровне организации (чтобы охватить все репозитории) или для конкретного репозитория.

Для организации:

  1. Перейдите в Настройки вашей организации
  2. Перейдите в раздел Webhooks (в разделе Code, planning, and automation)
  3. Нажмите Add webhook

Для репозитория:

  1. Перейдите в Настройки вашего репозитория
  2. Перейдите в раздел Webhooks
  3. Нажмите Add webhook

Конфигурация вебхука:

Поле Значение
Payload URL https://ваш-сайт-discourse.com/discourse-github/webhooks/github
Content type application/json
Secret Ваш сгенерированный секрет вебхука
SSL verification Включить (рекомендуется)
Events Выберите “Let me select individual events”

Выберите эти события:

  • Pull requests
  • Pull request reviews

Нажмите Add webhook, чтобы сохранить.

Шаг 4: Проверка настройки
  1. Создайте тестовый пост с URL-адресом PR GitHub
  2. Убедитесь, что однобус отображается с иконкой статуса
  3. Измените статус PR в GitHub (например, одобрите его или закройте)
  4. В течение нескольких секунд обновите страницу Discourse — статус должен обновиться

Вы можете проверить статус доставки вебхука в настройках вебхуков GitHub, чтобы подтвердить, что события отправляются и принимаются успешно.

Приоритет статуса

Когда у PR есть несколько состояний (например, одобрен, но также запрошены изменения), статус определяется следующим приоритетом:

  1. Слит (Merged) (наивысший приоритет)
  2. Закрыт
  3. Черновик
  4. Запрошены изменения
  5. Одобрено
  6. Открыт (по умолчанию)
Логика статуса рецензии

Функция получает информацию о рецензиях из API GitHub для определения статуса одобрения:

  • Берётся последняя рецензия от каждого рецензента
  • Состояния “прокомментировано” (commented) и “ожидает” (pending) игнорируются
  • Показывается “запрошены изменения”, если любой рецензент запросил изменения
  • Показывается “одобрено”, только если есть рецензии и ни одна из них не запрашивает изменения
Где это работает
  • Посты форума — Любой пост, содержащий однобус PR GitHub
  • Сообщения чата — Однобусы PR в чате также отображают актуальный статус

Примечание: Встроенные однобусы (когда ссылка появляется встроенной в текст, а не как полный предпросмотр) не отображают иконки статуса.

Миграция с компонента темы GitHub Status

Эта функция заменяет компонент темы GitHub Status Indicators. Они несовместимы и не должны использоваться вместе.

Если вы в настоящее время используете компонент темы:

  1. Отключите и удалите компонент темы github-status-theme
  2. Включите эту встроенную функцию через настройку github pr status enabled

Конфигурация

Токен доступа GitHub

Чтобы функция linkback работала, а значки назначались вашим пользователям, вам необходимо предоставить токен доступа GitHub. Вы можете сгенерировать токен здесь: Sign in to GitHub · GitHub.

Для функции linkback требуется область действия public_repo, а для назначения значков область действия не требуется (оставьте всё пустым, если вам нужны только значки). Поскольку область действия public_repo предоставляет права на запись в репозитории, мы рекомендуем создать временный аккаунт GitHub, у которого нет доступа ни к каким репозиториям, и использовать его только для генерации токена.

Области действия токенов по функциям

Функция Требуемая область действия
Значки Не требуется
Linkback public_repo
Статус PR (публичные репозитории) Не требуется
Статус PR (частные репозитории) repo

Справочник настроек сайта

Настройка По умолчанию Описание
enable discourse github plugin false Главный переключатель плагина
github badges enabled false Включить значки за вклад в GitHub
github badges repos (пусто) URL-адреса репозиториев для отслеживания значков
github linkback enabled false Включить linkback из GitHub в Discourse
github linkback access token (пусто) Токен доступа для функции linkback
github linkback projects (пусто) Проекты для создания linkback
github permalinks enabled false Заменять ссылки GitHub на постоянные ссылки
github pr status enabled false Включить иконки статуса PR в однобусах
github webhook secret (пусто) Секрет для проверки подписи вебхука
github onebox access tokens (пусто) Токены доступа к API GitHub (формат: org|token)

Технические детали

Использование API статуса PR

При генерации однобуса PR GitHub Discourse выполняет до двух вызовов API:

  1. Данные PR: GET /repos/{owner}/{repo}/pulls/{number} — Получает базовую информацию о PR, включая состояние, статус слияния и статус черновика
  2. Рецензии: GET /repos/{owner}/{repo}/pulls/{number}/reviews — Получает данные о рецензиях для определения статуса одобрения

Эти вызовы используют ваш настроенный токен доступа, если он доступен, что позволяет получать доступ к частным репозиториям.

Безопасность вебхуков

Запросы вебхуков проверяются с помощью валидации подписи HMAC-SHA256. GitHub подписывает полезную нагрузку вебхука вашим секретом, а Discourse проверяет эту подпись перед обработкой. Недействительные подписи отклоняются с ответом 403.

События вебхуков, вызывающие обновления

  • Изменение состояния PR (открыт, закрыт, повторно открыт)
  • Слияние PR
  • Изменение статуса черновика (превращён в черновик, готов к проверке)
  • Отправка рецензий на пул-реквесты
  • Редактирование или отмена рецензий

Вопросы производительности

  • Повторная обработка (rebaking) ставится в очередь как фоновая задача с низким приоритетом, чтобы не влиять на производительность сайта
  • Повторно обрабатываются только посты/сообщения с полными однобусами PR GitHub (встроенные однобусы пропускаются)
  • Повторная обработка сообщений чата пропускает уведомления, чтобы избежать дублирования оповещений

ЖУРНАЛ ИЗМЕНЕНИЙ (CHANGELOG)

2025-12-10

  • ИСПРАВЛЕНИЕ: Пропуск уведомлений при повторной обработке сообщений чата из вебхуков GitHub

2025-12-09

  • ИСПРАВЛЕНИЕ: Пропуск повторной обработки постов с встроенными однобусами PR GitHub
  • ИСПРАВЛЕНИЕ: Избегание промежуточного состояния при повторной обработке постов с однобусами
  • ИСПРАВЛЕНИЕ: Повторная обработка сообщений чата при изменении статуса PR GitHub
  • UX: Использование min-height для предотвращения сдвига макета при изменении иконки статуса
  • UX: Уменьшение размера иконки статуса PR GitHub на мобильных устройствах

2025-12-08

  • ФУНКЦИЯ: Добавление статуса “запрошены изменения” в однобусы PR GitHub

2025-12-04

  • ФУНКЦИЯ: Иконка актуального статуса PR GitHub

2025-11-10

  • ФУНКЦИЯ: Разрешённый и запрещённый списки для linkback

2025-11-08

  • ФУНКЦИЯ: Добавление списка игнорируемых категорий для linkback GitHub

2024-12-20

  • РАЗРАБОТКА: Перемещение discourse-github в ядро (больше не требуется отдельная установка)
33 лайка

Каков процесс для нескольких ссылок? Просто добавляет их в тот же комментарий к коммиту или создаёт новый комментарий каждый раз?

1 лайк

Интересно, можно ли упростить бейджи коммитов и PR, ведь мы стараемся избегать парадокса выбора :slight_smile:

Сейчас я просто сделал форк и удалил бейджи коммитов, но, конечно, я потерял связь с бейджем коммитов (потому что делаю коммиты напрямую), а форк — это не то же самое, что всегда оставаться в тесной связке с ядром проекта.

Подстановочный знак * не сработал для меня в случае организации GitHub, в итоге я добавил каждый репозиторий вручную. У кого-нибудь еще возникали проблемы с этим при работе с организацией, а не с пользователем?

Как установить язык комментария обратной ссылки?

Спасибо, мне очень нравится этот плагин! Я был сбит с толку системой значков, но рад, что нашел объяснение в другой теме: Github Badges are not working. Its hard to see if I do something wrong or if the plugin is not working - #4 by simon

Однако в том ответе отмечается, что

Плагин создает 6 значков:

Я не вижу ни одного из этих значков, не уверен, что произошло? Есть ли способ (повторно) запустить создание этих значков?

1 лайк

Чтобы ответить на свой собственный вопрос: через несколько часов запланированная задача выполнилась, и именно тогда были созданы значки.

Ручной способ сделать это, похоже, — запустить задачу Sidekiq.

1 лайк

Запрос функции: исключение категорий и/или тегов из обратных ссылок

У нас есть категория Announcements, в которую плагин RSS автоматически подтягивает новые релизы с GitHub. Когда в примечаниях к релизу есть ссылки на задачи, эта ссылка также появляется в Discourse, и создается обратная ссылка, но она никому не полезна и создает беспорядок на GitHub.

Я хотел бы иметь возможность исключать определенные сообщения, то есть категории или теги, или даже просто сообщения от пользователя, настроенного в плагине RSS, из создания обратных ссылок.

:partying_face: Этот плагин теперь включён в ядро Discourse в рамках Bundling more popular plugins with Discourse core. Если вы размещаете Discourse самостоятельно и используете этот плагин, вам нужно удалить его из файла app.yml перед следующим обновлением.

1 лайк