Discourse에 새로운 버전 관리 시스템을 도입할 계획입니다. 커뮤니티 관리자에게 더 많은 선택지와 예측 가능성을 제공하되, 개발 속도는 유지하는 것이 목표입니다. 또한 다른 소프트웨어와 더 잘 조화되도록 일부 용어를 조정하고 있습니다.
이 문서는 댓글을 받고, 시스템 구현을 시작하며, 새로운 릴리스 스트림의 사용을 확장하면서 진화할 것입니다.
현재 단계에서 의견이나 제안이 있으시면 이 주제에 답글을 남겨 알려주세요!
목표
-
개발 속도와 안정성 사이의 균형을 제공하는 더 규칙적인 '릴리스’를 Discourse에 도입합니다
-
약 6개월 간격으로 제공되며, 장기간 지원되는 릴리스를 계속 제공합니다
-
일반 릴리스와 확장 지원 릴리스의 지원 기간이 겹도록 하여, 관리자가 업데이트 시점에 대해 더 유연성을 가질 수 있도록 하면서도 중요한 보안 업데이트를 계속 받을 수 있도록 합니다
-
'릴리스’를 둘러싼 절차를 최소한으로 유지합니다. 가능한 한 많은 부분을 자동화하고, 핵심 개발자 경험을 늦추지 않아야 합니다. ESR 릴리스는 다른 어떤 릴리스와도 동일합니다.
-
개발자와 최종 사용자에게 설명하기 쉽게 하기 위해 명명 규칙과 절차가 업계 표준과 일치해야 합니다
고수준 개요
-
약 월 1회 릴리스를 수행합니다. ‘메이저’ 버전은 현재 연도이며, 각 릴리스마다 ‘마이너’ 버전이 증가합니다. 백포트된 수정 사항이 있을 경우 패치 버전 번호가 증가합니다
예: 2026년의 첫 번째 릴리스는
v2026.0이고, 그 다음은v2026.1등이 됩니다릴리스는 두 개의 완전한 릴리스 주기에 걸쳐 중요한 수정 사항을 받습니다. 예:
2026.0의 지원은2026.2가 릴리스될 때까지 계속됩니다. -
약 6개월마다 해당 릴리스 중 하나를 확장 지원 릴리스(ESR)로 선언합니다. ESR 버전은 다음 ESR이 선언된 후 2개의 릴리스 동안 지원됩니다.
예: v2026.0이 ESR이고 v2026.6이 다음 ESR이라면, v2026.0의 지원은 v2026.8이 릴리스될 때 종료됩니다. 월간 주기를 가정하면, 이는 ESR 지원 기간의 2개월 겹침을 의미합니다.
-
latest(최신 릴리스), 이전 릴리스, 그리고 활성 ESR 버전에 대해 중요한 수정 사항을 제공합니다. -
tests-passed분기를latest로 이름 변경합니다
1년간의 지원 기간에 대한 예시 그래프:
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
구현
-
각 릴리스는
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.이들은 비권장(deprecated)으로 간주되며, 우리는 미래에 일부 또는 전부를 제거하는 것을 목표로 할 것입니다. 특히 'beta’는 Discourse가 프로덕션 준비가 되어 있지 않다는 인상을 주기 때문에 문제적입니다.
-
latest에서 버전 번호는 현재 개발 중인 버전으로,-latest접미사가 붙습니다. 예:2026.3.0-latest
자동화된 릴리스 프로세스
매월, GitHub 액션이 main의 version.rb을 다음 -latest 버전으로 증가시키는 단일 커밋을 포함하는 새 PR을 엽니다.
사람이 PR을 병합하면, 다른 GitHub 액션이 main이 다음 -latest로 이동하는 것을 감지하여 완료된 릴리스를 위한 분기를 생성합니다. 본질적으로, 이 분기는 '릴리스 후보’가 됩니다. -latest 접미사를 version.rb에서 제거하여 릴리스를 '완료’하는 업데이트를 포함하는 릴리스 분기 대상의 또 다른 자동화된 PR이 열립니다.
보통, 우리는 이 두 PR을 연속적으로 병합합니다. 그러나 릴리스 생성과 완료를 위한 별도의 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, 그리고 후방 호환성 별칭)를 최신 상태로 유지합니다.
보안 수정 사항
보안 수정 사항 워크플로우는 크게 동일하지만, 이제 다음 세 곳 중 두 곳에서 수정 사항을 수행해야 합니다:
-
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 시스템에 대한 의존성이 증가합니다. 따라서 호환성 시스템에 대한 몇 가지 개선이 필요합니다.
main의 .discourse-compatibility 파일을 사용하는 대신, 특별히 이름이 지정된 분기/태그에 기반한 암시적 호환성을 지원할 수 있습니다. 이는 커밋 해시를 수동으로 관리하는 것보다 훨씬 쉬워야 합니다. 예를 들어, 플러그인에는 다음과 같은 분기가 있을 수 있습니다
d-compat/v2026.1d-compat/v2026.2d-compat/v2026.3main(자신의 분기가 없는 모든 Discourse 버전에 사용됨)
플러그인을 설치할 때, Discourse는 현재 버전과 일치하는 분기를 확인할 수 있습니다. 존재하면, 그 분기를 체크아웃합니다. 그렇지 않으면, .discourse-compatibility 파일을 확인합니다. 그렇지 않으면, 기본 분기를 체크아웃합니다.
각 테마/플러그인에서 매일 실행되어 새로운 Discourse 릴리스를 확인하고 이러한 분기를 자동으로 생성하는 공개 GitHub 액션을 만들 수 있습니다. 각 테마/플러그인은 이 자동 고정(auto-pinning) 액션을 사용할지, 또는 더 ‘플로팅’ 전략을 취할지 선택할 수 있습니다.
discourse.org 호스팅
초기에는, 우리의 호스팅 제공은 Discourse의 latest 버전을 계속 실행할 것입니다. 미래에는, 엔터프라이즈 등급 고객이 ‘릴리스’ 버전을 선택할 수 있는 옵션을 탐색할 것입니다.
표준 설치 기본값
초기에는, 기본값은 latest로 유지됩니다. 관리자는 현재 stable에 옵트인하는 것과 동일한 방식으로 새로운 릴리스 스트림에 옵트인할 수 있습니다. 시스템이 더 성숙해지면, 우리는 미래에 릴리스 스트림 간에 더 쉬운 전환을 탐색할 수 있습니다.