Estamos planeando introducir un nuevo sistema de versionado para Discourse. Nuestro objetivo es proporcionar más opciones y previsibilidad para los administradores de la comunidad, manteniendo nuestra velocidad de desarrollo. También estamos ajustando parte de la terminología para que se alinee mejor con otro software.
Este documento evolucionará a medida que recibamos comentarios, comencemos a implementar el sistema y luego ampliemos el uso de los nuevos flujos de lanzamiento.
Si tiene algún comentario/sugerencia en esta etapa, ¡háganoslo saber respondiendo a este tema!
Objetivos
-
Introducir ‘lanzamientos’ más regulares para Discourse, que proporcionen un equilibrio entre la velocidad de desarrollo y la estabilidad.
-
Continuar proporcionando aproximadamente lanzamientos cada 6 meses, que se admitan durante un período prolongado.
-
Proporcionar soporte superpuesto para lanzamientos regulares y de soporte extendido, de modo que los administradores tengan más flexibilidad sobre el momento de las actualizaciones, mientras continúan recibiendo actualizaciones críticas de seguridad.
-
Mantener la ceremonia en torno a los ‘lanzamientos’ al mínimo. En la medida de lo posible, se automatizará y no ralentizará la experiencia del desarrollador principal. Los lanzamientos ESR son iguales que cualquier otro lanzamiento.
-
El nombre y el procedimiento deben coincidir con los estándares de la industria, de modo que sea más fácil de explicar a los desarrolladores y usuarios finales.
Descripción general de alto nivel
-
Realizar aproximadamente un lanzamiento por mes. La versión ‘principal’ es el año actual y la versión ‘secundaria’ se incrementa con cada lanzamiento. El número de versión de parche se incrementará para cualquier corrección retroportada.
por ejemplo, el primer lanzamiento de 2026 sería
v2026.0, el siguiente seríav2026.1, etc.Los lanzamientos recibirán correcciones críticas durante dos ciclos de lanzamiento completos. por ejemplo, el soporte para
2026.0continuará hasta que se lance2026.2. -
Aproximadamente cada 6 meses, declarar uno de esos lanzamientos como Lanzamiento de Soporte Extendido (ESR). Las versiones ESR permanecen admitidas durante 2 lanzamientos después de que se declara el siguiente ESR.
por ejemplo, si v2026.0 es ESR, y v2026.6 es el siguiente ESR, entonces el soporte de v2026.0 finalizará cuando se lance v2026.8. Suponiendo una cadencia mensual, eso sería una superposición de 2 meses en el soporte ESR.
-
Proporcionar correcciones críticas para
latest, el lanzamiento más reciente, el lanzamiento anterior y cualquier versión ESR activa. -
Renombrar la rama
tests-passedalatest.
Ejemplo de gráfico de períodos de soporte durante un año:
gantt
title Lanzamientos y Períodos de Soporte de Discourse (enero de 2026 - enero de 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
Implementación
-
Cada lanzamiento tendrá una rama creada a partir de
latest. Estas estarán en un espacio de nombres y se conservarán indefinidamente. Por ejemplo,v2026.1tendría una rama llamadarelease/2026.1. -
Cada lanzamiento de parche se etiquetará. por ejemplo,
v2026.1.0,v2026.1.1, etc. -
El último lanzamiento se etiquetará como
release. El último ESR se etiquetará comoesr. -
El lanzamiento anterior se etiquetará como
release-previous. El ESR activo anterior (si lo hay) se etiquetará comoesr-previous. -
Para compatibilidad con versiones anteriores, las etiquetas que coincidan con los flujos de lanzamiento existentes se enlazarán a su equivalente nuevo más cercano.
stable→esr.beta→release.tests-passed→latest.Estas se considerarán obsoletas y nuestro objetivo será eliminarlas en el futuro. En particular, ‘beta’ es problemático porque da la impresión de que Discourse no está listo para producción.
-
En
latest, el número de versión será la versión en desarrollo actual, con el sufijo-latest. por ejemplo,2026.3.0-latest.
Proceso de lanzamiento automatizado
Cada mes, una acción de GitHub abrirá una nueva PR que contendrá un solo commit que incrementará version.rb en main a la siguiente versión -latest.
Una vez que un humano fusione la PR, otra acción de GitHub detectará que main se mueve a la siguiente versión -latest y creará una rama para el lanzamiento completado. Esencialmente, esta rama se convierte en un ‘candidato a lanzamiento’. Se abrirá otra PR automatizada contra la rama de lanzamiento con una actualización para eliminar el sufijo -latest de version.rb, y así ‘lanzarla’.
Por lo general, fusionaremos estas dos PR rápidamente. Pero tener PR separadas para crear y finalizar el lanzamiento nos da la opción de abordar cualquier problema en la rama antes de finalizar.
%%{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'
Por separado, otro flujo de trabajo de acciones de GitHub observará cualquier commit retroportado a las ramas de lanzamiento. Cuando se encuentren, se generará una nueva PR para incrementar la versión de parche en esa rama. Un humano puede decidir cuándo fusionar esas PR.
Todas estas automatizaciones mantendrán automáticamente actualizadas varias etiquetas (release, release-previous, esr, esr-previous, además de los alias de compatibilidad con versiones anteriores).
Correcciones de seguridad
El flujo de trabajo de corrección de seguridad sigue siendo en gran medida el mismo, excepto que ahora necesitamos hacer las correcciones en dos de estos tres lugares nuevos:
-
latest -
esr -
esr-previous
-
release
-
release-previous
(Recuerde, según la ilustración anterior, son solo dos de los tres porque esr-previous está admitido, el nuevo esr es el mismo que release o release-previous, y eliminamos el soporte para esr-previous cuando eso ya no sea cierto).
Al introducir una corrección de seguridad en latest, se moverá automáticamente una etiqueta latest-security-fix a ese commit. docker_manager se actualizará para monitorear esa etiqueta y solicitar a los administradores que actualicen. Esto nos permite lanzar y notificar sobre correcciones de seguridad sin necesidad de acelerar un incremento de versión.
Traducciones
En este momento, las ramas stable y tests-passed se pueden traducir en CrowdIn, y los resultados se integran regularmente. En el nuevo sistema, inicialmente planeamos que latest y release sean traducibles en CrowdIn.
Idealmente, para cuando release se convierta en release-previous o esr, las traducciones se habrán asentado. Si hay demanda de traducciones continuas de esas versiones, entonces eso es algo que podría considerarse en el futuro.
Compatibilidad de plugins/temas
El aumento del uso de flujos que no sean latest de Discourse aumentará nuestra dependencia del sistema discourse-compatibility. Por lo tanto, necesitamos algunas mejoras en el sistema de compatibilidad.
En lugar de usar un archivo .discourse-compatibility en main, podríamos admitir la compatibilidad implícita basada en ramas/etiquetas con nombres especiales. Esto debería ser mucho más fácil que hacer malabares con hashes de commit manualmente. Por ejemplo, un plugin podría tener ramas como:
d-compat/v2026.1d-compat/v2026.2d-compat/v2026.3main(utilizado para cualquier versión de Discourse que no tenga su propia rama)
Al instalar un plugin, Discourse puede buscar una rama que coincida con la versión actual. Si existe, la extrae. De lo contrario, consulta el archivo .discourse-compatibility. De lo contrario, extrae la rama predeterminada.
Podemos crear una acción pública de GitHub que se ejecute diariamente en cada tema/plugin, verifique nuevos lanzamientos de Discourse y cree automáticamente estas ramas. Cada tema/plugin podría optar por usar esta acción de fijación automática, o podrían optar por una estrategia más ‘flotante’.
Alojamiento de discourse.org
Inicialmente, nuestra oferta alojada continuará ejecutando la versión latest de Discourse. En el futuro, exploraremos opciones para que nuestros clientes de nivel empresarial seleccionen una versión de ‘lanzamiento’.
Valores predeterminados de instalación estándar
Inicialmente, el valor predeterminado seguirá siendo latest. Los administradores podrán optar por el nuevo flujo de lanzamiento de la misma manera que optan por stable en este momento. Es posible que exploremos cambios más fáciles entre los flujos de lanzamiento en el futuro, una vez que el sistema sea más maduro.