Мы планируем внедрить новую систему версионирования для Discourse. Наша цель — предоставить администраторам сообществ больше выбора и предсказуемости, сохраняя при этом темпы разработки. Мы также корректируем некоторые термины, чтобы лучше согласовать их с общепринятыми в других программных продуктах.
Этот документ будет обновляться по мере получения комментариев, начала внедрения системы и расширения использования новых потоков релизов.
Если у вас есть комментарии или предложения на данном этапе, пожалуйста, сообщите нам, ответив на эту тему!
Цели
-
Внедрить более регулярные «релизы» для Discourse, обеспечивающие баланс между скоростью разработки и стабильностью.
-
Продолжать выпускать примерно раз в полгода релизы с расширенной поддержкой.
-
Обеспечить перекрывающуюся поддержку регулярных релизов и релизов с расширенной поддержкой, чтобы администраторы имели больше гибкости в выборе времени обновления, продолжая при этом получать критические обновления безопасности.
-
Свести к минимуму церемонии вокруг «релизов». Максимально возможная часть процесса должна быть автоматизирована и не должна замедлять работу основных разработчиков. Релизы ESR ничем не отличаются от любых других релизов.
-
Именование и процедуры должны соответствовать отраслевым стандартам, чтобы их было проще объяснять разработчикам и конечным пользователям.
Обзор высокого уровня
-
Выпускать примерно один релиз в месяц. «Мажорная» версия — это текущий год, а «минорная» версия увеличивается с каждым релизом. Номер версии патча будет увеличиваться для любых исправлений, перенесенных из других версий.
Например, первый релиз 2026 года будет
v2026.0, следующий —v2026.1и так далее.Релизы будут получать критические исправления в течение двух полных циклов релизов. Например, поддержка
2026.0будет продолжаться до выхода2026.2. -
Примерно каждые 6 месяцев один из этих релизов объявляется релизом с расширенной поддержкой (ESR). Версии ESR поддерживаются в течение 2 релизов после объявления следующего ESR.
Например, если v2026.0 — это ESR, а v2026.6 — следующий ESR, то поддержка v2026.0 прекратится при выходе v2026.8. При ежемесячном цикле это означает 2 месяца пересечения поддержки ESR.
-
Предоставлять критические исправления для
latest(самый последний релиз), предыдущего релиза и любых активных версий ESR. -
Переименовать ветку
tests-passedвlatest.
Пример графика периодов поддержки в течение года:
gantt
title Релизы и периоды поддержки Discourse (январь 2026 – январь 2027)
dateFormat YYYY-MM-DD
axisFormat %b %Y
2026.0 (ESR) :active, 2026-01-27, 2026-09-29
2026.1 :done, 2026-02-24, 2026-04-28
2026.2 :done, 2026-03-31, 2026-05-26
2026.3 :done, 2026-04-28, 2026-06-30
2026.4 :done, 2026-05-26, 2026-07-28
2026.5 :done, 2026-06-30, 2026-08-25
2026.6 (ESR) :active, 2026-07-28, 2027-01-26
2026.7 :done, 2026-08-25, 2026-10-27
2026.8 :done, 2026-09-29, 2026-11-24
2026.9 :done, 2026-10-27, 2026-12-29
2026.10 :done, 2026-11-24, 2027-01-26
2026.11 :done, 2026-12-29, 2027-01-26
Внедрение
-
Каждый релиз будет иметь ветку, созданную из
latest. Они будут иметь пространство имен и сохраняться неограниченно долго. Например, дляv2026.1будет создана ветка с именемrelease/2026.1. -
Каждый патч-релиз будет помечен тегом. Например:
v2026.1.0,v2026.1.1и т. д. -
Последний релиз будет помечен тегом
release. Последний ESR будет помечен тегомesr. -
Предыдущий релиз будет помечен тегом
release-previous. Предыдущая активная версия ESR (если есть) будет помечена тегомesr-previous. -
Для обратной совместимости теги, соответствующие существующим потокам релизов, будут алиасами ближайших новых эквивалентов.
stable→esr.beta→release.tests-passed→latest.Эти теги будут считаться устаревшими, и мы планируем в будущем отказаться от некоторых или всех из них. В частности, «beta» проблематична, так как создает впечатление, что Discourse не готов к использованию в продакшене.
-
В ветке
latestномер версии будет соответствовать текущей разрабатываемой версии с суффиксом-latest. Например:2026.3.0-latest.
Автоматизированный процесс релизов
Каждый месяц действие GitHub открывает новый PR, содержащий один коммит, который обновляет version.rb в ветке main до следующей версии -latest.
После того как человек сольет PR, другое действие GitHub обнаружит переход main к следующей версии -latest и создаст ветку для завершенного релиза. По сути, эта ветка становится «кандидатом в релизы». Затем откроется еще один автоматический PR против ветки релиза с обновлением для удаления суффикса -latest из version.rb, тем самым «выпустив» релиз.
Обычно мы будем сливать эти два PR в quick succession. Но наличие отдельных PR для создания и завершения релиза дает нам возможность устранить любые проблемы в ветке перед финализацией.
%%{init: { 'logLevel': 'debug', 'gitGraph': {'showBranches': true, 'showCommitLabel':true,'mainBranchOrder': 2}} }%%
gitGraph
checkout main
commit id:'version v2026.1-latest'
commit id:'...'
commit id:'....'
branch 'release/2026.1'
commit id:'version 2026.1'
checkout 'main'
commit id:'version v2026.2-latest'
Отдельно другой рабочий процесс действий GitHub будет отслеживать любые коммиты с переносом исправлений в ветки релизов. При обнаружении таких коммитов будет создан новый PR для обновления номера патча в этой ветке. Человек может решить, когда сливать эти PR.
Все эти автоматизации будут автоматически поддерживать актуальность различных тегов (release, release-previous, esr, esr-previous, а также алиасы обратной совместимости).
Исправления безопасности
Рабочий процесс исправлений безопасности остается largely прежним, за исключением того, что теперь нам нужно вносить исправления в двух из этих трех новых мест:
-
latest -
esr -
esr-previous
-
release
-
release-previous
(Помните, согласно предыдущей иллюстрации, это только два из трех, потому что esr-previous поддерживается, новый esr совпадает с release или release-previous, и мы прекращаем поддержку esr-previous, когда это перестает быть верным).
При внедрении исправления безопасности в latest тег latest-security-fix будет автоматически перемещен на этот коммит. docker_manager будет обновлен для отслеживания этого тега и предложения администраторам обновиться. Это позволяет нам выпускать и уведомлять об исправлениях безопасности без необходимости ускоренного обновления версии.
Переводы
В настоящее время ветки stable и tests-passed можно переводить в CrowdIn, и результаты регулярно интегрируются. В новой системе мы изначально планируем сделать latest и release переводимыми в CrowdIn.
В идеале, к моменту, когда release станет release-previous или esr, переводы стабилизируются. Если будет спрос на непрерывный перевод этих версий, это можно будет рассмотреть в будущем.
Совместимость плагинов и тем
Увеличение использования потоков Discourse, отличных от latest, усилит нашу зависимость от системы discourse-compatibility. Поэтому нам потребуются улучшения в этой системе совместимости.
Вместо использования файла .discourse-compatibility в ветке main, мы могли бы поддерживать неявную совместимость на основе специально именованных веток/тегов. Это должно быть намного проще, чем вручную управлять хешами коммитов. Например, плагин может иметь ветки, такие как:
d-compat/v2026.1d-compat/v2026.2d-compat/v2026.3main(используется для любой версии Discourse, у которой нет своей ветки)
При установке плагина Discourse может проверить наличие ветки, соответствующей текущей версии. Если она существует, проверить её. В противном случае проверить файл .discourse-compatibility. В противном случае проверить ветку по умолчанию.
Мы можем создать публичное действие GitHub, которое ежедневно запускается для каждой темы/плагина, проверяет новые релизы Discourse и автоматически создает эти ветки. Каждая тема/плагин может выбрать использование этого действия для автоматического привязывания или предпочесть более «плавающую» стратегию.
Хостинг discourse.org
Изначально наше хостинговое предложение будет продолжать использовать версию latest Discourse. В будущем мы будем исследовать возможности для клиентов корпоративного уровня выбирать версию «release».
Настройки по умолчанию для стандартной установки
Изначально настройка по умолчанию останется latest. Администраторы смогут подключиться к новому потоку релизов так же, как они сейчас подключаются к стабильной версии. В будущем, когда система станет более зрелой, мы можем рассмотреть возможность более простых переключений между потоками релизов.