الإصدارات وقناة ما قبل الإصدار¶
كيف تُصدر Turbo EA إصداراتها وتضع وسومها وتنشر صور الحاويات. هذه الصفحة هي المرجع للمشغّلين الذين يحتاجون إلى تثبيت الإصدارات في الإنتاج وللمساهمين الذين يقطعون الإصدارات.
وضع الإصدارات¶
تتّبع Turbo EA الإصدارات الدلالية. المصدر الوحيد للحقيقة للإصدار الحالي هو ملف /VERSION في جذر المستودع.
- التصحيح (مثل
1.0.0←1.0.1): إصلاحات أخطاء فقط. آمن دائمًا للترقية. - الفرعي (مثل
1.0.0←1.1.0): ميزات جديدة. متوافق رجعيًا وفق سياسة التوافق. - الرئيسي (مثل
1.x←2.0.0): تغييرات كاسرة. تأتي ملاحظات الترحيل مع الإصدار.
يُرفع الإصدار مرة واحدة لكل PR، لا لكل commit. يستخدم إدخال CHANGELOG في الـ PR الإصدار الجديد كعنوان؛ ويُفشل version-check.yml في CI أي PR يرفع VERSION دون عنوان ## [<version>] مطابق في CHANGELOG.md.
وسوم صور الحاويات¶
كل دفع إلى main وكل وسم v*.*.* يُشغّل .github/workflows/docker-publish.yml، الذي يبني ويدفع صورًا متعددة المعماريات (amd64 + arm64) إلى GHCR.
لوسم إصدار مثل v1.2.3، الوسوم المنشورة على كل صورة هي:
| الوسم | يشير إلى | مستقر؟ |
|---|---|---|
1.2.3 |
ذلك الإصدار بالضبط | نعم — ثبّت هذا في الإنتاج |
1.2 |
أحدث تصحيح على 1.2.x |
يتدحرج إلى الأمام على التصحيحات |
1 |
أحدث فرعي على 1.x |
يتدحرج إلى الأمام على الفرعيات |
latest |
أحدث إصدار ليس ما قبل إصدار | يتدحرج إلى الأمام على كل إصدار |
sha-<short> |
الـ commit بالضبط | نعم — تصحيح الأخطاء / ما قبل الإصدار |
بالنسبة للدفعات إلى main (دون وسم)، يُنتَج فقط وسما main وsha-<short> — لا latest أبدًا، ولا أي وسم semver.
تُوقَّع جميع بيانات صور الحاويات المنشورة بـ cosign keyless OIDC. تفاصيل التحقق وSBOM في سلسلة التوريد.
قناة ما قبل الإصدار¶
بالنسبة للإصدارات الفرعية التي تغيّر تخطيط الحاوية، أو الصور الأساسية، أو معرّفات UID الافتراضية، أو أسماء وحدات التخزين، أو المنافذ الافتراضية، أو المخطط بطريقة تتطلّب إجراءً من المشغّل، يُقطع مرشّح إصدار قبل الوسم النهائي.
الأعراف:
- وسوم RC هي
vX.Y.0-rc.N— لا تكون أبدًا على إصدار تصحيح، فقط على الإصدارات الفرعية ذات التغييرات المرئية للمشغّل. - يُهيَّأ
docker/metadata-actionفي سير عمل النشر بـflavor: latest=auto. هذا يستبعد تلقائيًا وسوم ما قبل الإصدار من نوع semver من:latestو:X.Yو:X— تُنشر مرشّحات RC فقط كـ:X.Y.0-rc.N. المشغّلون الذين يثبّتون على:latestلن يسحبوا RC بالخطأ. - ينبغي تعليم إصدار GitHub لوسم RC كـ ما قبل إصدار في صفحة الإصدارات. سير عمل
github-release.ymlالحالي ينشئ دائمًا إصدارًا ليس ما قبل إصدار؛ يقلب المسؤول مفتاح ما قبل الإصدار يدويًا بعد تشغيل سير العمل (أو يحرّر الإصدار عبرgh release edit vX.Y.0-rc.N --prerelease).
وقت النضج:
- يبقى RC منشورًا لمدة 48–72 ساعة على الأقل قبل الترقية، أو حتى يبلّغ مشغّل واحد على الأقل خارج المسؤول عن ترقية ناجحة — أيهما أطول.
- تُشحن تقارير الأخطاء ضد RC كـ
vX.Y.0-rc.N+1إذا كانت المشكلة تستحق الإصلاح. يُترك RC السابق في GHCR لقابلية إعادة الإنتاج.
الترقية إلى النهائي:
- يُنشأ الوسم النهائي
vX.Y.0على نفس الـ commit الخاص بآخر RC. يعيد سير عمل النشر بناء وإعادة وسم الصور متعددة المعماريات؛ سيختلف الـ digest عن RC رغم تطابق المصدر (مدخلات البناء تتضمّن طوابع زمنية). - تنتقل وسوم
:X.Yو:Xو:latestللإشارة إلى الإصدار النهائي عند هذه النقطة.
قطع إصدار (قائمة تحقق المسؤول)¶
لتصحيح أو إصدار فرعي عادي — دون الحاجة إلى قناة RC:
- على فرع ميزة، ارفع
VERSIONوأضف العنوان المطابق## [<version>] - YYYY-MM-DDإلىCHANGELOG.md. - شغّل
python scripts/dump_openapi.pyإذا تغيّر أي مسار أو مخطط في الخلفية؛ ثبّت النتيجة إن تغيّرت. - افتح الـ PR. يشغّل CI الفحص اللغوي والاختبارات وفحص انحراف OpenAPI و
version-check.yml. - ادمج بالضغط (squash-merge) إلى
main. - من
main:git tag -s v<version> -m "v<version>"(أوgit tag v<version>إن لم يُهيَّأ مفتاح توقيع)،git push origin v<version>. - يستخرج سير عمل
Publish GitHub Releaseقسم## [<version>]منCHANGELOG.mdوينشئ إصدار GitHub. - يبني سير عمل
Publish Docker images to GHCRالصور متعددة المعماريات ويوقّعها وينشرها. - تحقّق باستخدام cosign:
cosign verify \ --certificate-identity-regexp 'https://github.com/vincentmakes/turbo-ea/.+' \ --certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \ ghcr.io/vincentmakes/turbo-ea/backend:<version>
لإصدار فرعي يستدعي RC:
- نفس تدفق الـ PR والدمج أعلاه، لكن ارفع إلى
1.Y.0-rc.1. - بعد الدمج، ضع وسم
v1.Y.0-rc.1وادفع. يبني سير عمل النشر صور RC ويدفعها (فقط:1.Y.0-rc.1، لا:latestأو الوسوم القصيرة أبدًا —flavor: latest=autoيتولّى ذلك). ينشئ سير عمل الإصدار إصدار GitHub؛ اقلبه يدويًا إلى ما قبل إصدار بعد ذلك عبرgh release edit v1.Y.0-rc.1 --prereleaseأو في واجهة GitHub. - انتظر نافذة النضج. عالج أي مشكلات مُبلَّغ عنها بـ
-rc.2و-rc.3حسب الحاجة. - للترقية: ارفع
VERSIONإلى1.Y.0في PR نهائي (إدخال CHANGELOG يدمج كل إصلاحات RC)، ادمج، ضع وسمv1.Y.0، ادفع. تشير الآن وسوم:latestوالقصيرة إلى الإصدار المُرقّى.
نهاية العمر¶
يتلقى أحدث خط فرعي فقط إصلاحات الأمان. راجع SECURITY.md للسياسة الكاملة. الخطوط الفرعية الأقدم في نهاية العمر ولن تتلقى نقلًا عكسيًا للإصلاحات — ينبغي للمشغّلين على الإصدارات الأقدم التخطيط للترقيات عبر سياسة التوافق.