Wir planen, eine neue Versionierungsstruktur für Discourse einzuführen. Unser Ziel ist es, Administratoren von Communities mehr Auswahlmöglichkeiten und Vorhersehbarkeit zu bieten und gleichzeitig unsere Entwicklungsgeschwindigkeit beizubehalten. Wir passen auch einige Terminologien an, um sie besser an andere Software anzupassen.
Dieses Dokument wird sich weiterentwickeln, wenn wir Kommentare erhalten, mit der Implementierung des Systems beginnen und dann die Nutzung der neuen Release-Streams erweitern.
Wenn Sie in dieser Phase Kommentare/Vorschläge haben, lassen Sie es uns bitte wissen, indem Sie auf dieses Thema antworten!
Ziele
-
Einführung regelmäßigerer „Releases“ für Discourse, die ein Gleichgewicht zwischen Entwicklungsgeschwindigkeit und Stabilität bieten.
-
Fortsetzung der Bereitstellung von ca. 6-monatigen Releases, die über einen längeren Zeitraum unterstützt werden.
-
Bereitstellung überlappender Unterstützung für reguläre und Langzeit-Support-Releases, damit Administratoren mehr Flexibilität bei der Aktualisierung haben und weiterhin kritische Sicherheitsupdates erhalten.
-
Die Zeremonie rund um „Releases“ auf ein Minimum beschränken. So viel wie möglich sollte automatisiert werden und die Kernentwicklungserfahrung nicht verlangsamen. ESR-Releases sind genauso wie alle anderen Releases.
-
Benennung und Verfahren sollten Industriestandards entsprechen, damit sie für Entwickler und Endbenutzer leichter zu erklären sind.
Grobe Übersicht
-
Etwa ein Release pro Monat. Die „Hauptversion“ ist das aktuelle Jahr, und die „Nebenversion“ wird mit jedem Release inkrementiert. Die Patch-Versionsnummer wird für alle zurückportierten Korrekturen erhöht.
z. B. wäre das erste Release von 2026
v2026.0, das nächstev2026.1usw.Releases erhalten kritische Korrekturen für zwei vollständige Release-Zyklen. z. B. würde die Unterstützung für
2026.0bis zur Veröffentlichung von2026.2fortgesetzt. -
Etwa alle 6 Monate wird eines dieser Releases als Extended Support Release (ESR) deklariert. ESR-Versionen bleiben zwei Releases nach der Deklaration des nächsten ESR unterstützt.
z. B. wenn v2026.0 ESR ist und v2026.6 das nächste ESR ist, endet die Unterstützung für v2026.0 mit der Veröffentlichung von v2026.8. Bei einer monatlichen Kadenz wäre dies eine 2-monatige Überlappung der ESR-Unterstützung.
-
Bereitstellung kritischer Korrekturen für
latest, das neueste Release, das vorherige Release und alle aktiven ESR-Versionen. -
Umbenennung des
tests-passed-Branches inlatest.
Beispielgraph der Support-Zeiträume über ein Jahr:
gantt
title Discourse Releases und Support-Zeiträume (Jan 2026 – Jan 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
Implementierung
-
Jedes Release erhält einen Branch, der von
latestabgeschnitten wird. Diese werden benannt und bleiben auf unbestimmte Zeit erhalten. Zum Beispiel hättev2026.1einen Branch namensrelease/2026.1. -
Jedes Patch-Release wird getaggt. z. B.
v2026.1.0,v2026.1.1usw. -
Das neueste Release wird mit
releasegetaggt. Das neueste ESR wird mitesrgetaggt. -
Das vorherige Release wird mit
release-previousgetaggt. Das vorherige aktive ESR (falls vorhanden) wird mitesr-previousgetaggt. -
Zur Abwärtskompatibilität werden Tags, die den bestehenden Release-Streams entsprechen, auf das nächstgelegene neue Äquivalent umgeleitet.
stable→esr.beta→release.tests-passed→latest.Diese werden als veraltet betrachtet, und wir werden versuchen, einige oder alle davon in Zukunft zu entfernen. Insbesondere „beta“ ist problematisch, da es den Eindruck erweckt, dass Discourse nicht produktionsreif ist.
-
Auf
latestist die Versionsnummer die aktuell in Entwicklung befindliche Version, ergänzt um-latest. z. B.2026.3.0-latest.
Automatisierter Release-Prozess
Jeden Monat öffnet eine GitHub-Aktion eine neue PR, die einen einzelnen Commit enthält, der version.rb auf main auf die nächste -latest-Version hochstuft.
Sobald ein Mensch die PR zusammenführt, erkennt eine weitere GitHub-Aktion, dass main zur nächsten -latest-Version wechselt, und schneidet einen Branch für das abgeschlossene Release ab. Im Wesentlichen wird dieser Branch zu einem „Release Candidate“. Eine weitere automatisierte PR wird gegen den Release-Branch geöffnet, um mit einem Update das -latest-Suffix von version.rb zu entfernen und es dadurch zu „releasen“.
Normalerweise werden wir diese beiden PRs schnell hintereinander zusammenführen. Das Vorhandensein separater PRs für die Erstellung und Fertigstellung des Releases gibt uns jedoch die Möglichkeit, Probleme im Branch vor der Fertigstellung zu beheben.
%%{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'
Separat wird ein weiterer GitHub-Actions-Workflow auf zurückportierte Commits zu Release-Branches achten. Wenn welche gefunden werden, wird eine neue PR generiert, um die Patch-Version auf diesem Branch zu erhöhen. Ein Mensch kann entscheiden, wann diese PRs zusammengeführt werden.
All diese Automatisierungen halten automatisch verschiedene Tags (release, release-previous, esr, esr-previous sowie Abwärtskompatibilitäts-Aliase) auf dem neuesten Stand.
Sicherheitsfixes
Der Workflow für Sicherheitsfixes bleibt weitgehend gleich, mit der Ausnahme, dass wir die Fixes nun an zwei dieser drei neuen Stellen vornehmen müssen:
-
latest -
esr -
esr-previous
-
release
-
release-previous
(Denken Sie daran, dass gemäß der vorherigen Abbildung nur zwei der drei erforderlich sind, da esr-previous unterstützt wird, das neue esr dasselbe ist wie release oder release-previous, und wir die Unterstützung für esr-previous einstellen, wenn dies nicht mehr der Fall ist.)
Wenn ein Sicherheitsfix in latest eingeführt wird, wird automatisch ein latest-security-fix-Tag auf diesen Commit verschoben. docker_manager wird aktualisiert, um diesen Tag zu überwachen und Administratoren aufzufordern, zu aktualisieren. Dies ermöglicht es uns, Sicherheitsfixes zu veröffentlichen und darüber zu informieren, ohne eine Versionserhöhung erzwingen zu müssen.
Übersetzungen
Derzeit können die Branches stable und tests-passed in CrowdIn übersetzt werden, und die Ergebnisse werden regelmäßig integriert. Im neuen System planen wir zunächst, latest und release in CrowdIn übersetzbar zu machen.
Idealerweise sind die Übersetzungen bis zu dem Zeitpunkt, an dem release zu release-previous oder esr wird, abgeschlossen. Wenn eine Nachfrage nach kontinuierlichen Übersetzungen dieser Versionen besteht, könnte dies in Zukunft in Betracht gezogen werden.
Plugin-/Theme-Kompatibilität
Die verstärkte Nutzung von Nicht-latest-Streams von Discourse wird unsere Abhängigkeit vom discourse-compatibility-System erhöhen. Daher benötigen wir einige Verbesserungen am Kompatibilitätssystem.
Anstatt eine .discourse-compatibility-Datei auf main zu verwenden, könnten wir stattdessen implizite Kompatibilität basierend auf speziell benannten Branches/Tags unterstützen. Dies sollte viel einfacher sein, als Commit-Hashes manuell zu jonglieren. Zum Beispiel könnte ein Plugin Branches haben wie:
d-compat/v2026.1d-compat/v2026.2d-compat/v2026.3main(verwendet für jede Discourse-Version, die keinen eigenen Branch hat)
Beim Installieren eines Plugins kann Discourse nach einem Branch suchen, der mit der aktuellen Version übereinstimmt. Wenn er existiert, wird er ausgecheckt. Andernfalls wird die .discourse-compatibility-Datei geprüft. Andernfalls wird der Standard-Branch ausgecheckt.
Wir können eine öffentliche GitHub-Aktion erstellen, die täglich auf jedem Theme/Plugin ausgeführt wird, nach neuen Discourse-Releases sucht und diese Branches automatisch erstellt. Jedes Theme/Plugin kann sich entscheiden, diese Auto-Pinning-Aktion zu nutzen, oder eine flexiblere Strategie verfolgen.
discourse.org-Hosting
Anfänglich wird unser gehostetes Angebot weiterhin die latest-Version von Discourse ausführen. In Zukunft werden wir Optionen für unsere Enterprise-Kunden prüfen, um eine „Release“-Version auszuwählen.
Standard-Installationsstandards
Anfänglich bleibt der Standard latest. Administratoren können sich auf die gleiche Weise für den neuen Release-Stream entscheiden, wie sie sich derzeit für stable entscheiden. Wir könnten in Zukunft einfachere Wechsel zwischen den Release-Streams untersuchen, sobald das System ausgereifter ist.