نحن نخطط لإدخال نظام إصدار جديد لـ Discourse. هدفنا هو توفير المزيد من الخيارات والقدرة على التنبؤ لمسؤولي المجتمعات، مع الحفاظ على سرعة تطويرنا. نقوم أيضًا بتعديل بعض المصطلحات لتتوافق بشكل أفضل مع البرامج الأخرى.
ستتطور هذه الوثيقة مع تلقينا للتعليقات، وبدء تنفيذ النظام، ثم توسيع استخدام تدفقات الإصدار الجديدة.
إذا كانت لديك أي تعليقات/اقتراحات في هذه المرحلة، فيرجى إخبارنا بالرد على هذا الموضوع!
الأهداف
-
تقديم “إصدارات” أكثر انتظامًا لـ Discourse، والتي توفر توازنًا بين سرعة التطوير والاستقرار.
-
الاستمرار في تقديم إصدارات كل 6 أشهر تقريبًا، والتي يتم دعمها لفترة طويلة.
-
توفير دعم متداخل للإصدارات العادية وإصدارات الدعم الممتد، بحيث يتمتع المسؤولون بمزيد من المرونة في توقيت التحديثات، مع الاستمرار في تلقي تحديثات الأمان الهامة.
-
الحفاظ على الحد الأدنى من المراسم حول “الإصدارات”. يجب أن يتم أتمتة أكبر قدر ممكن، ولا يجب أن يبطئ تجربة المطور الأساسية. إصدارات ESR هي نفسها أي إصدار آخر.
-
يجب أن تتطابق التسمية والإجراءات مع معايير الصناعة، بحيث يسهل شرحها للمطورين والمستخدمين النهائيين.
نظرة عامة عالية المستوى
-
إصدار تقريبي لإصدار واحد شهريًا. الإصدار “الرئيسي” هو السنة الحالية، ويتزايد الإصدار “الفرعي” مع كل إصدار. سيتم زيادة رقم إصدار التصحيح لأي إصلاحات يتم إرجاعها.
على سبيل المثال، سيكون الإصدار الأول من عام 2026 هو
v2026.0، والإصدار التالي سيكونv2026.1، وما إلى ذلك.ستتلقى الإصدارات إصلاحات هامة لدورتي إصدار كاملتين. على سبيل المثال، سيستمر دعم
2026.0حتى يتم إصدار2026.2. -
كل 6 أشهر تقريبًا، يتم الإعلان عن أحد هذه الإصدارات كإصدار دعم ممتد (ESR). تظل إصدارات ESR مدعومة لمدة إصدارين بعد الإعلان عن ESR التالي.
على سبيل المثال، إذا كان v2026.0 هو ESR، وكان v2026.6 هو ESR التالي، فسينتهي دعم v2026.0 عند إصدار v2026.8. بافتراض وتيرة شهرية، سيكون ذلك تداخلًا لمدة شهرين في دعم ESR.
-
توفير إصلاحات هامة لـ
latest، والإصدار الأخير، والإصدار السابق، وأي إصدارات ESR نشطة. -
إعادة تسمية الفرع
tests-passedإلىlatest.
مثال على رسم بياني لفترات الدعم على مدار عام:
gantt
title فترات إصدار ودعم Discourse (يناير 2026 - يناير 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. سيتم تسمية أحدث ESResr. -
سيتم تسمية الإصدار السابق
release-previous. سيتم تسمية ESR النشط السابق (إن وجد)esr-previous. -
للتوافق مع الإصدارات السابقة، سيتم ربط العلامات التي تطابق تدفقات الإصدار الحالية بأقرب ما يعادلها الجديد.
stable→esr.beta→release.tests-passed→latest.سيتم اعتبار هذه العلامات مهملة، وسنهدف إلى إسقاط بعضها أو كلها في المستقبل. على وجه الخصوص، يعتبر “beta” إشكاليًا لأنه يعطي انطباعًا بأن Discourse غير جاهز للإنتاج.
-
على
latest، سيكون رقم الإصدار هو الإصدار قيد التطوير حاليًا، متبوعًا بـ-latest. على سبيل المثال،2026.3.0-latest.
عملية الإصدار الآلي
كل شهر، سيفتح إجراء GitHub طلب سحب جديد يحتوي على التزام واحد يقوم بترقية version.rb على main إلى الإصدار التالي -latest.
بمجرد أن يقوم شخص بدمج طلب السحب، سيكتشف إجراء GitHub آخر انتقال main إلى الإصدار التالي -latest ويقطع فرعًا للإصدار المكتمل. في الأساس، سيصبح هذا الفرع “مرشحًا للإصدار”. سيتم فتح طلب سحب آلي آخر مقابل فرع الإصدار بتحديث لإزالة اللاحقة -latest من version.rb، وبالتالي “إصداره”.
عادةً، سنقوم بدمج هذين الطلبين بسرعة. ولكن وجود طلبات سحب منفصلة لإنشاء الإصدار وإكماله يمنحنا خيار معالجة أي مشكلات في الفرع قبل إكماله.
%%{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 أخرى أي التزامات تم إرجاعها إلى فروع الإصدار. عند العثور على أي منها، سيتم إنشاء طلب سحب جديد لزيادة إصدار التصحيح على هذا الفرع. يمكن للشخص أن يقرر متى يقوم بدمج طلبات السحب هذه.
ستقوم كل هذه الأتمتة تلقائيًا بتحديث العلامات المختلفة (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. لذلك نحتاج إلى بعض التحسينات لنظام التوافق.
بدلاً من استخدام ملف .discourse-compatibility على main، يمكننا بدلاً من ذلك دعم التوافق الضمني بناءً على فروع/علامات مسماة خصيصًا. سيكون هذا أسهل بكثير من التعامل مع تجزئات الالتزام يدويًا. على سبيل المثال، يمكن أن تحتوي الإضافة على فروع مثل
d-compat/v2026.1d-compat/v2026.2d-compat/v2026.3main(يستخدم لأي إصدار Discourse لا يحتوي على فرع خاص به)
عند تثبيت إضافة، يمكن لـ Discourse التحقق من وجود فرع يطابق الإصدار الحالي. إذا كان موجودًا، فقم بسحبه. بخلاف ذلك، تحقق من ملف .discourse-compatibility. بخلاف ذلك، قم بسحب الفرع الافتراضي.
يمكننا إنشاء إجراء GitHub عام يعمل على كل سمة/إضافة يوميًا، ويتحقق من إصدارات Discourse الجديدة، وينشئ هذه الفروع تلقائيًا. يمكن لكل سمة/إضافة اختيار استخدام هذا الإجراء التثبيت التلقائي، أو يمكنها اتباع استراتيجية “عائمة” أكثر.
استضافة discourse.org
مبدئيًا، سيستمر عرضنا المستضاف في تشغيل أحدث إصدار من Discourse. في المستقبل، سنستكشف خيارات لعملائنا من فئة المؤسسات لاختيار إصدار “release”.
إعدادات التثبيت القياسية
مبدئيًا، سيظل الإعداد الافتراضي هو latest. سيتمكن المسؤولون من الاشتراك في تدفق الإصدار الجديد بنفس الطريقة التي يشتركون بها في stable حاليًا. قد نستكشف تبديلات أسهل بين تدفقات الإصدار في المستقبل، بمجرد أن يصبح النظام أكثر نضجًا.