RFC: Новая стратегия версионирования для Discourse

Хорошо, но, кажется, я ещё меньше понимаю суть проблемы :confused:

В конечном счёте, это не так важно, согласно последним комментариям @david, так что просто подведу итог.

Предлагаемая модель: ежемесячные релизы плюс две версии ESR, например, для 2026 года:

  • 2026.1
  • 2026.2
  • 2026.3
  • 2026.8
  • 2026.9
  • 2026.10

Таким образом, если мы находимся в октябре 2026 года и версии .2 и .8 являются ESR, это означает 4 поддерживаемые версии.

А я подумал: не было бы проще сделать квартальные версии, например, для 2026 года:

  • 2026.1
  • 2026.2
  • 2026.3

При этом поддерживались бы только текущая и предыдущая версии, так что в октябре 2026 года их было бы всего 2.

Вся эта логика исходила из того, что это могло бы облегчить жизнь как разработчикам, так и пользователям. Но, как упоминалось выше: @david уточнил, что менее частые релизы не рассматриваются.

Понял. Это примерно так, как я и ожидал. Действительно, в данном случае была бы полезна хотя бы среднесрочная поддержка инструментами.

Я представляю это так: вы находитесь на конкретном канале релизов (latest, release, esr), и обычно довольно быстро переходите к следующему релизу, поэтому было бы здорово получать сообщение и/или уведомление о доступности нового релиза и иметь одну команду для переключения на него. Также было бы неплохо получать напоминание, когда используемый вами релиз устаревает или перестаёт поддерживаться, если вы отложили переход на новый релиз. Бонусные баллы, если соответствующий инструмент позволит быстро переключаться между каналами релизов :slightly_smiling_face:

Но я понимаю, если это сейчас не является приоритетом номер один, и вы всё ещё рекомендуете людям оставаться на версии test-passed/latest.

Понятно. В контексте моей работы доставка функции клиентам считается «быстрой» :sweat_smile:

Также, как упоминалось выше, я думал, что переход на квартальный график фактически облегчит вашу жизнь (и жизнь разработчиков плагинов и тем), поскольку будет меньше веток, требующих поддержки. Но если это не так, то, видимо, это действительно не имеет смысла для вас :slightly_smiling_face:

Я не вижу никакой пользы в предлагаемой вами схеме версионирования по годам. Придерживайтесь номеров версий, соответствующих SemVer!

Сам по себе SemVer не предназначен для крупных приложений. Насколько я понимаю, он больше ориентирован на библиотеки, используемые в программном обеспечении, и в частности, логика нумерации версий построена вокруг API пакета.

Тем не менее, мы могли бы применить семантическое версионирование к нашим API(s). Обсуждение более строгих гарантий для API, которые предоставляет Discourse, безусловно, стоит провести, но я считаю, что это отдельная тема.

Теперь я понимаю, что вы не предлагали нам соблюдать стандарт SemVer — вы просто сказали, что нам следует придерживаться использования чисел, соответствующих системе нумерации, specified в SemVer.

  1. Обычный номер версии ДОЛЖЕН иметь вид X.Y.Z, где X, Y и Z — неотрицательные целые числа, и НЕ ДОЛЖНЫ содержать ведущие нули. X — основная версия, Y — минорная версия, Z — патч-версия. Каждый элемент ДОЛЖЕН увеличиваться численно. Например: 1.9.0 → 1.10.0 → 1.11.0.

Я думаю, что предложение о «ведущих нулях» — это единственное, от чего нам пришлось бы отойти, если мы выберем этот путь.

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

Отложив всё это в сторону, не могли бы вы подробнее объяснить, почему, по вашему мнению, соблюдение системы нумерации SemVer имеет ценность?

ОП утверждает, что вы не используете ведущие нули, если я правильно понимаю.

Также был предложен ещё один веский аргумент в пользу использования ведущих нулей (сортировка версий). Ведущие нули — это текущий план? (Мне всё ещё больше нравятся версии по месяцам, чем серийные версии).

Суть SemVer заключается в том, что номер версии должен передавать какую-либо полезную информацию. Единственная информация, передаваемая вашей предлагаемой схемой, — это орбита Земли вокруг Солнца. Эта информация не очень полезна для потребителя программного обеспечения.

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

Не совсем так. Суть в том, чтобы сообщить пользователю о характере выпуска.

Если выпуск представляет собой обновление патч-версии, это означает, что набор изменений не содержит ничего, что могло бы повлиять на рабочий процесс пользователей программного обеспечения.

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

Если выпуск представляет собой обновление мажорной версии, это означает, что набор изменений включает изменения, которые могут нарушить существующие рабочие процессы пользователей программного обеспечения.

Определение того, какой из компонентов версии следует обновить, более однозначно в программном продукте с единственным пользовательским интерфейсом, но принципы остаются теми же даже для программного продукта, такого как Discourse, где существует множество уровней интерфейсов и типов потребителей (например, разработчики плагинов, потребители API, сотрудники форума, конечные пользователи).

Даже если выбор компонента для обновления в этом проекте программного обеспечения является несколько субъективным, это всё равно придаёт номеру версии смысл, а не делает его просто произвольным числом, как это происходит с вашим предложением.

Я предлагал это несколькими постами выше.

В отличие от SemVer, предложенная схема нумерации версий сразу показывает, поддерживается ли версия (как в Ubuntu). Поскольку это также зависит от орбиты Земли вокруг Солнца, это действительно имеет смысл.

Это явно направлено на пакеты и библиотеки. Любой релиз Discourse включает изменения, которые могут нарушить существующие рабочие процессы пользователей программного обеспечения. Я даже видел, как это случалось с патчами безопасности. SemVer неприменим к сложным приложениям.

Да, именно так, см.

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

Чтобы подчеркнуть мысль, которая может быть упущена, считаю, что Discourse справляется с этим отлично. Одним из улучшений было бы как минимум выделение тем, которые вы уже написали и которые описывают изменения и возможные сбои в рамках этого цикла обновлений. Например, при выпуске версии 3.5 мне пришлось открыть примечания к выпуску, перейти по ссылке на блог, а затем случайно кликнуть на ссылку о включении плагинов в ядро Discourse, чтобы заметить тот факт, что оставление этих плагинов в моём файле конфигурации может повлиять на обновления.

Было бы здорово вынести такие заметки на отдельную страницу/тему для ESR-выпусков, даже если это просто набор ссылок на существующие темы, которые следует изучить перед выполнением обновления до ESR.

Однако это может выходить за рамки данной темы — мой отзыв об изменении системы версионирования заключается в том, что я приветствую его и ценю прозрачность здесь. Я считаю, что это станет отличным улучшением, которое упростит процессы и одновременно даст нам больше возможностей для самостоятельного хостинга.

Спасибо!

Да, это такая отличная идея, что я думаю, пост автора стоит отредактировать, чтобы отразить это!

Рассматривается вопрос о ведущих нулях и о том, следует ли явно стремиться к синхронизации с месяцами. @david предоставит обновление, как только группа, работающая над этим вопросом, примет решение.

Это не та важная информация, которая нужна администратору форума при оценке нового релиза.

Нет, действительно. Вы упускаете суть SemVer, отказываясь понимать, что «API» на самом деле означает просто интерфейс. Нет абсолютно никаких причин, по которым дух SemVer нельзя было бы использовать при нумерации версий любого типа программного обеспечения.

Я думаю, нам придется в этом пункте остаться при разных мнениях, @per1234.

Вот обсуждение по теме в репозитории GitHub для semver с ответом от одного из разработчиков:

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

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

Главный вопрос: планируете ли вы внедрять поддерживаемое устаревание функций в одном релизе, а их полное удаление — только в следующем мажорном? Наличие устаревших, но поддерживаемых функций требует значительных усилий. При изменениях в модели сохраняемых данных устаревание часто становится невозможным. В таком случае нельзя даже выпустить минорную версию с устаревшими функциями — приходится сразу переходить к следующей мажорной версии. Именно здесь крупные приложения обычно сталкиваются с проблемами: вы переходите от 3.0.0 к 3.0.1, а затем к 4.0.0, потому что не можете обеспечить обратную совместимость. Если у вас часто происходят breaking changes, соблюдение semver приносит мало пользы.

Тем не менее, я гораздо больше предпочитаю именно такой подход, поскольку он чётче сообщает разработчикам о предстоящих breaking changes. Схема YYYY.N ничего не говорит ни разработчику, ни администратору.

Итак, вопрос в том, что именно вы хотите донести через версию? Если вы планируете шесть релизов с новыми функциями (которые могут быть, а могут и не быть breaking), и каждый шестой релиз будет получать более длительную поддержку с патчами, при этом вы не хотите версионировать патч-релизы, то схема X.Y подойдёт, где Y=0 обозначает релиз с длительной поддержкой. X — просто число. Проблема возникает, когда X — это год: тогда Y быстро начинает ассоциироваться с месяцем. Значит, новые релизы с длительной поддержкой будут выходить в январе? Мне всегда приходится проверять, какая версия Ubuntu является LTS, и это меня раздражает.

А что если Discourse просто продолжит использовать текущую мажорную версию? Следующий релиз с длительной поддержкой будет называться 4.0; затем выйдут 4.1–4.5 как релизы с новыми функциями; после этого — 5.0, который станет новейшим релизом с длительной поддержкой.

Также исчезнет неловкая ситуация, когда релиз откладывается из-за серьёзной проблемы.

При желании можно добавить номер «патча», если вы планируете явно выпускать патчи (вместо непрерывных обновлений). «Но тогда получится x.y.z, что и есть semver». Нет, это лишь выглядит как semver, но им не является. Каждый новый «минорный» релиз может содержать breaking changes. Поэтому я предлагаю просто придерживаться схемы X.Y, где Y=0 означает LTS.

Отдельно от строки версии: мне нравится новый план релизов.

Да, именно так обстоят дела сегодня, особенно с гибкой системой тем.

Поэтому я считаю, что вы абсолютно правы:

Это также означает, что часть «major» в нашем текущем номере версии практически ничего не сообщает.

Поэтому возникла мысль: «Эй, может быть, стоит использовать год, чтобы сообщить хоть что-то».

:rocket:

Это обсуждение выглядит не очень хорошо. Я вижу, что команда разработки приняла решение перейти на новую систему версионирования, которая имеет смысл для них, в то время как другие внезапно начали считать, что версия Discourse следовала семантическому версионированию… чего не было. Это всегда была rolling-версия, по крайней мере, начиная с версии 1.0, или нет?

Но аргументы всех сторон в споре кажутся несостоятельными:

  • «индустриальный стандарт»: Linux использует чётные главные версии для стабильных выпусков и нечётные для разработки.
  • «земля вращается вокруг Солнца»: ну, если вы примете ислам, то попадёте в неприятности, потому что версии будут пропущены, и они больше не будут соответствовать оборотам Солнца, а будут синхронизированы с циклами Луны. Здесь вы теперь понимаете, что, выбрав схему версионирования YYYY.Y.Z вместо X.Y.Z, вы навязали доминирующую культуру.
  • Минорные выпуски остаются неясными: вы упоминаете «предполагая месячный ритм», но это может быть также 3 недели или 7 дней, в зависимости от функциональности. В таком случае имеет смысл вести отсчёт Y с нуля, или же вы действительно планируете выпускать версии раз в месяц, в этом случае отсчёт M с единицы был бы более логичным?

Главное изменение, которое я вижу, заключается в том, что, приняв месячный ритм, команда Discourse формирует ожидания и отказывается от целевых дат выпуска в пользу регулярных релизов.

LTS на 8 месяцев не звучит особенно «долгосрочно». NodeJS развивается слишком быстро, но они поддерживают LTS в течение 30 месяцев и одновременно несколько текущих версий, а Ubuntu сохраняет LTS на протяжении лет. Хотя я понимаю, что Discourse ни язык программирования, ни операционная система, это кажется сигналом о том, что новый функционал будет выпускаться довольно быстро, что поднимает ещё один вопрос: поскольку новые настройки администратора появляются время от времени, мы скоро попадём в ад WordPress с бесконечными опциями и непостижимой сложностью администрирования сайта, иначе говоря, в раздутый софт. Тогда становится важным прояснить, как перейти от существующих релизов с целевыми датами к регулярным выпускам и как выбирать, какие цели отбрасывать (или откладывать) для конкретного релиза и т. д. (возможно, это уже задокументировано, но я это пропустил.)

Не могли бы вы поделиться своими соображениями относительно темпа разработки и системы версионирования, а также тем, что вы планируете сделать, чтобы администраторы не утонули в избытке настроек и не столкнулись с повышенным порогом обучения?

:heart: :discourse:

Прежде чем отвечать на ваши остальные вопросы, я хочу сначала прояснить, что наша предполагаемая частота релизов не изменится в рамках этого предложения.

  • В течение последних 3 лет мы выпускали «стабильные» версии примерно каждые 6 месяцев, ориентируясь на конец января и июля каждого года, с небольшими отклонениями здесь и там:
  • В течение последних ~8 месяцев мы выпускали «бета-версии» примерно раз в месяц, за исключением нескольких внеплановых выпусков с исправлениями безопасности:

В рамках этого нового предложения мы намерены сохранить тот же ритм, которого придерживались ранее. Основные изменения заключаются в следующем:

  • То, что сейчас мы называем «стабильными» релизами, мы будем называть «релизами с расширенной поддержкой».
    • Мы выбрали это название, а не «долгосрочная поддержка», потому что согласны с тем, что поддержка здесь действительно «расширенная» по сравнению с другими поддерживаемыми релизами, но не обязательно «долгосрочная». Это предложение не предусматривает добавления релизов с долгосрочной поддержкой.
    • В настоящее время поддержка одного стабильного релиза заканчивается немедленно при выпуске следующего. В рамках этого нового предложения поддержка будет перекрываться примерно на 2 месяца, чтобы у пользователей было время обновиться, продолжая получать исправления безопасности.
  • То, что сейчас мы называем «бета-версиями», мы будем называть просто «релизами».
    • В настоящее время мы вообще не поддерживаем бета-версии после даты их выпуска. Они служат лишь контрольными точками на пути развития и сопровождаются уведомлением о необходимости перехода на следующую версию, так как часто включают в себя исправления безопасности.
    • В рамках этого предложения мы намерены поддерживать релизы в течение ~2 месяцев, чтобы пользователи могли решить, когда обновляться, продолжая при этом получать исправления безопасности.

Учитывая всё вышесказанное, считаете ли вы, что ваши остальные вопросы о слишком большом количестве настроек всё ещё связаны с этим предложением? Или это независимые вопросы, которые лучше обсудить в отдельной теме?

Спасибо за ваше подробное объяснение, @mcwumbly!

Действительно, это другой вопрос. Кастомизация админ-панели с помощью плагина была бы полезна для тестирования того, как это могло бы выглядеть. Ведутся ли какие-либо работы в рамках такого подхода?

Не конкретно это, но в прошлом году мы вложили значительные усилия в улучшение интерфейса административной панели. Если вы хотите глубже разобраться в этих вопросах, создайте новую тему и опишите некоторые проблемы или идеи, которые вы хотели бы обсудить подробнее.

Это отличное изменение (мне особенно нравится наложение ESR-версий)

Обратная связь:

  1. Я хотел бы видеть график жизненного цикла на централизованной странице, чтобы я мог легко его проверять. В идеале, там должна быть таблица EOL (End of Life), чтобы я мог в любой момент времени четко понимать, какие версии поддерживаются, а какие нет, и соответственно планировать свои действия (хотя бы для ESR-версий).

  2. Переключение потоков выпуска:

Это было бы замечательно, но даже просто возможность выбрать нужный тег во время настройки имела бы огромное значение. Или хотя бы включить ручные шаги в документацию по настройке. Если кто-то хочет начать работу со стабильной/ESR-версией, сейчас совершенно неясно, как это сделать новому администратору. (Кажется, ответ — передать флаг –skip-rebuild в ./launcher, затем отредактировать версию и выполнить rebuild в первый раз, но я не уверен.) В противном случае настройка сразу же запускает процесс загрузки и запуска последней версии, а откат назад чреват проблемами.

(Пример сложности для нового администратора: прямо сейчас первый результат поиска по запросу «установить Discourse stable» ведет на эту тему, которая ссылается на другую тему, где объясняется, как обновиться до стабильной версии, но не как установить стабильную версию с нуля.)

Сегодня мы сделали ещё один шаг в реализации этого RFC — последняя версия Discourse имеет номер v2025.11.0, и мы уже начали работу над v2025.12.0-latest в ветке latest :tada: