Stiamo pianificando di introdurre un nuovo sistema di versioning per Discourse. Il nostro obiettivo è fornire maggiore scelta e prevedibilità agli amministratori della community, mantenendo al contempo la nostra velocità di sviluppo. Stiamo inoltre modificando alcune terminologie per allinearle meglio ad altri software.
Questo documento si evolverà man mano che riceveremo commenti, inizieremo a implementare il sistema ed espanderemo l’uso dei nuovi flussi di rilascio.
Se avete commenti/suggerimenti in questa fase, fatecelo sapere rispondendo a questo argomento!
Obiettivi
- Introdurre ‘release’ più regolari per Discourse, che forniscano un equilibrio tra velocità di sviluppo e stabilità
- Continuare a fornire circa 6 rilasci semestrali che sono supportati per un periodo prolungato
- Fornire supporto sovrapposto per i rilasci regolari e quelli a supporto esteso, in modo che gli amministratori abbiano maggiore flessibilità sui tempi di aggiornamento, continuando a ricevere aggiornamenti critici di sicurezza
- Mantenere al minimo la cerimonia attorno ai ‘release’. Il più possibile dovrebbe essere automatizzato e non rallentare l’esperienza dello sviluppatore principale. I rilasci ESR sono uguali a qualsiasi altro rilascio.
- La denominazione e la procedura dovrebbero corrispondere agli standard del settore, in modo che sia più facile spiegarlo agli sviluppatori e agli utenti finali
Panoramica di alto livello
-
Tagliare circa un rilascio al mese. La versione ‘maggiore’ è l’anno corrente, e la versione ‘minore’ si incrementa con ogni rilascio. Il numero di versione di patch verrà incrementato per eventuali correzioni backportate
es. il primo rilascio del 2026 sarà
v2026.0, il successivo saràv2026.1, ecc.I rilasci riceveranno correzioni critiche per due cicli di rilascio completi. es. il supporto per
2026.0continuerà fino al rilascio di2026.2. -
Circa ogni 6 mesi, dichiarare uno di questi rilasci come Extended Support Release (ESR). Le versioni ESR rimangono supportate per 2 rilasci dopo la dichiarazione del successivo ESR.
es. se v2026.0 è ESR, e v2026.6 è il successivo ESR, allora il supporto per v2026.0 terminerà al rilascio di v2026.8. Assumendo una cadenza mensile, ciò comporterebbe una sovrapposizione di 2 mesi nel supporto ESR.
-
Fornire correzioni critiche per
latest, l’ultimo rilascio, il rilascio precedente e tutte le versioni ESR attive. -
Rinominare il branch
tests-passedinlatest
Esempio di grafico dei periodi di supporto nel corso di un anno:
gantt
title Discourse Releases and Support Periods (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
Implementazione
-
Ogni rilascio avrà un branch tagliato da
latest. Questi saranno namespaces e conservati indefinitamente. Ad esempio,v2026.1avrà un branch chiamatorelease/2026.1 -
Ogni rilascio di patch sarà taggato. es.
v2026.1.0,v2026.1.1, ecc. -
L’ultimo rilascio sarà taggato
release. L’ultimo ESR sarà taggatoesr. -
Il rilascio precedente sarà taggato
release-previous. L’ESR attivo precedente (se presente) sarà taggatoesr-previous. -
Per retrocompatibilità, i tag che corrispondono ai flussi di rilascio esistenti saranno aliasati al nuovo equivalente più vicino.
stable→esr.beta→release.tests-passed→latest.Questi saranno considerati deprecati, e mireremo a eliminarne alcuni o tutti in futuro. In particolare, ‘beta’ è problematico perché dà l’impressione che Discourse non sia pronto per la produzione.
-
Su
latest, il numero di versione sarà la versione attualmente in sviluppo, suffissata con-latest. es.2026.3.0-latest
Processo di rilascio automatizzato
Ogni mese, un’azione di GitHub aprirà una nuova PR contenente un singolo commit che incrementa version.rb su main alla successiva versione -latest.
Una volta che un umano avrà unito la PR, un’altra azione di GitHub rileverà che main è passato alla successiva versione -latest e creerà un branch per il rilascio completato. Essenzialmente, questo branch diventerà un ‘release candidate’. Un’altra PR automatizzata verrà aperta contro il branch di rilascio con un aggiornamento per rimuovere il suffisso -latest da version.rb, e quindi ‘rilasciarlo’.
Di solito, uniremo queste due PR in rapida successione. Ma avere PR separate per la creazione e la finalizzazione del rilascio ci dà la possibilità di affrontare eventuali problemi nel branch prima della finalizzazione.
%%{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'
Separately, another GitHub actions workflow will watch for any backported commits to release branches. When any are found, a new PR will be generated to bump the patch version on that branch. A human can decide when to merge those PRs.
Tutte queste automazioni manterranno automaticamente aggiornati vari tag (release, release-previous, esr, esr-previous, più alias di retrocompatibilità).
Correzioni di sicurezza
Il flusso di lavoro per le correzioni di sicurezza rimane in gran parte lo stesso, tranne per il fatto che ora dobbiamo apportare le correzioni in due dei seguenti tre posti:
latestesresr-previous
release
release-previous
(Ricorda, secondo l’illustrazione precedente, sono solo due dei tre perché esr-previous è supportato, il nuovo esr è uguale a release o release-previous, e interrompiamo il supporto per esr-previous quando ciò non è più vero).
Quando si introduce una correzione di sicurezza in latest, un tag latest-security-fix verrà automaticamente spostato su quel commit. docker_manager verrà aggiornato per monitorare quel tag e chiedere agli amministratori di aggiornare. Questo ci consente di rilasciare e notificare le correzioni di sicurezza senza dover accelerare un incremento di versione.
Traduzioni
Al momento, i branch stable e tests-passed possono essere tradotti in CrowdIn, e i risultati vengono regolarmente integrati. Nel nuovo sistema, inizialmente prevediamo che latest e release siano traducibili in CrowdIn.
Idealmente, entro il momento in cui release diventerà release-previous o esr, le traduzioni si saranno stabilizzate. Se c’è una domanda per traduzioni continue di quelle versioni, allora è qualcosa che potrebbe essere considerato in futuro.
Compatibilità Plugin/Tema
L’aumento dell’uso di flussi non-latest di Discourse aumenterà la nostra dipendenza dal sistema discourse-compatibility. Quindi abbiamo bisogno di alcuni miglioramenti al sistema di compatibilità.
Invece di utilizzare un file .discourse-compatibility su main, potremmo invece supportare la compatibilità implicita basata su branch/tag nominati in modo speciale. Questo dovrebbe essere molto più semplice che destreggiarsi manualmente con gli hash dei commit. Ad esempio, un plugin potrebbe avere branch come
d-compat/v2026.1d-compat/v2026.2d-compat/v2026.3main(utilizzato per qualsiasi versione di Discourse che non ha un proprio branch)
Quando si installa un plugin, Discourse può controllare un branch corrispondente alla versione corrente. Se esiste, effettua il checkout. Altrimenti, controlla il file .discourse-compatibility. Altrimenti, effettua il checkout del branch predefinito.
Possiamo creare un’azione GitHub pubblica che viene eseguita quotidianamente su ogni tema/plugin, controlla i nuovi rilasci di Discourse e crea automaticamente questi branch. Ogni tema/plugin potrebbe scegliere di utilizzare questa azione di auto-fissaggio, oppure potrebbe optare per una strategia più ‘fluttuante’.
Hosting discourse.org
Inizialmente, la nostra offerta ospitata continuerà a eseguire la versione latest di Discourse. In futuro, esploreremo opzioni per i nostri clienti di livello enterprise per selezionare una versione ‘release’.
Impostazioni predefinite di installazione standard
Inizialmente, l’impostazione predefinita rimarrà latest. Gli amministratori potranno scegliere di aderire al nuovo flusso di rilascio nello stesso modo in cui aderiscono attualmente a stable. Potremmo esplorare switch più semplici tra i flussi di rilascio in futuro, una volta che il sistema sarà più maturo.