Faragiri
العربية

كل اللغات

تعلم نشر المشاريعالبرمجة

رفع يوسف إصلاحا فوق نسخة عاملة، فمحاها. مجلد لكل إصدار ورابط واحد يحول، وصفحة رجوع بالعربية تسلم مع المشروع.

7الأقسام
5دقائق القراءة
2العمق

الموضوع الذي لم يعلن أحد أنه موضوع

لا تدور واحدة منها وحدها، ولذلك يفشل تعلمها واحدة بعد واحدة

لا أولى بينها. كل واحدة بلا الأخريين قليلة النفع، ولهذا يصل الموضوع كله دفعة واحدة ويشبه جدارا.

  • التاريخ
  • البناء من لا شيء
  • الدليل
  • التاريختسجيلات وفروع. بدونه لا توجد نسخة سابقة يرجع إليها.
  • البناء من لا شيءبيئة معلنة. بدونه يسجل التاريخ كودا لا يعمل إلا على جهاز واحد.
  • الدليلالاختبارات. بدونها تتحرك الاثنتان بسرعة ولا أحد يعرف هل بقي شيء يعمل.

الأسنان متساوية لأن لا واحدة منها هي العجلة الكبيرة. وما تتركه الصورة خارجها أنها تتبنى بالترتيب الخاطئ عادة، فتركب الأتمتة فوقها قبل أن توجد واحدة منها.

يوسف يعمل مستقلا من الإسكندرية، وسلم موقع طلبات لمعرض أثاث في المدينة نفسها. مساء الخميس رفع إصلاحا صغيرا عبر برنامج FTP فوق الملفات العاملة. الموقع توقف. النسخة التي كانت تعمل قبل ساعة لم تعد موجودة في أي مكان على الأرض.

المعرض سجل طلبات الجمعة والسبت على ورق، وعاد الموقع صباح الأحد. ولم يكن العطل في الإصلاح، ولا في الاستضافة. العطل أن الرفع فوق نسخة عاملة عملية باتجاه واحد.

الرجوع نشر آخر، لا حالة طوارئ

الرجوع نشر للنسخة السابقة، وعليه أن يكون بالسهولة نفسها. ما دام التقدم أمرا واحدا والرجوع ارتجالا في منتصف الليل، فالرجوع لن يحدث، وسيحل محله إصلاح متسرع فوق موقع معطل.

والشكل الذي يجعل الاثنين متساويين لا يحتاج أداة. كل إصدار يرفع إلى مجلد باسمه، ويشير رابط رمزي واحد إلى العامل منها:

  • releases/2026-09-08-1430/
  • releases/2026-09-08-1902/
  • current -> releases/2026-09-08-1902

والنشر تحويل الرابط إلى المجلد الجديد، والرجوع تحويله إلى القديم، وكلاهما أمر واحد:

  • ln -sfn releases/2026-09-08-1430 current

الرفع فوق نسخة عاملة يمحوها، فلا يبقى شيء يرجع إليه، وهذا هو الفرق كله بين الشكلين. الأول يكتب فوق التاريخ، والثاني يضيف إليه ويحول مؤشرا. وثمن الثاني مساحة قرص لثلاثة إصدارات قديمة، وهي أرخص شيء في هذه الصفحة.

revert يصنع تسجيلة، وreset يحرك الفرع

git revert يصنع تسجيلة جديدة، وgit reset يحرك الفرع، والفرق بينهما ليس أسلوبا. الأول يضيف إلى التاريخ تسجيلة تعكس أثر تسجيلة سابقة، فيبقى ما جرى مكتوبا ويستطيع كل من سحب الفرع أن يسحب الإصلاح فوقه. والثاني يحرك مؤشر الفرع إلى الخلف كأن شيئا لم يكن.

  • git revert a1b2c3d
  • git reset --hard a1b2c3d

والقاعدة العملية سطر واحد: على فرع رفع إلى مستودع مشترك يستعمل الأول وحده. الثاني يعيد كتابة تاريخ عند غيرك، فيرى زميلك أو العميل تاريخا لا يطابق تاريخه، ويصلح ذلك بدفع يمحو عمله أو عملك. وموضع هذا كله إدارة الإصدارات، وهو موضوع قائم بذاته لا نصيحة عابرة.

الآلة التي تبني لا تملك شيئا

الآلة التي تبني لا تملك شيئا، وذلك ما يجعلها صادقة. جهاز يوسف عليه أثر سنتين من العمل: نسخة لغة نصبها مرة ونسيها، ومكتبة نظام جاءت مع أداة أخرى، ومتغير بيئة كتبه في ملف الصدفة قبل عام. الكود يعمل عنده لأن الجهاز يكمله في صمت.

والآلة في خط البناء تبدأ فارغة في كل مرة، فتفشل عند أول شيء غير معلن. وهذا هو نفعها كله: هي أول جهاز ثان يجرب عليه المشروع، وتفشل قبل العميل لا بعده. وأرخص خطوة أولى فيها ليست اختبارا ولا نشرا، هي البناء وحده على آلة فارغة عند كل دفع.

وما تمسكه هذه الخطوة هو تحديدا العطل الذي أضاع أشهر كثيرين: المكتبة غير المعلنة، ونسخة اللغة، والملف الذي كان موجودا على جهاز واحد.

الصورة ملف واحد فيه الاعتماديات ولغة التشغيل والكود

الصورة ملف واحد فيه الاعتماديات ولغة التشغيل والكود. الوصف المكتوب لخطوات التنصيب يشيخ في أسبوعين ولا يشتكي، والصورة لا تشيخ لأنها لا توصف، هي تبنى وتشغل. والخادم الذي يشغلها لا يحتاج أن يعرف باللغة التي كتب بها المشروع.

وهذا يقلب معنى الرجوع مرة أخرى: الرجوع إلى صورة قديمة أنظف من الرجوع إلى مجلد قديم، لأن المجلد يرجع الكود وحده ويترك ما حوله على ما هو عليه.

ويبقى ما لا تمسكه أي طبقة من هذه: تغيير صحيح البناء وخاطئ المعنى. يبنى ويعبر ويوزع بأمانة على كل خادم. ولذلك النسخة السابقة المحفوظة هي الطبقة الأخيرة، وهي الوحيدة التي لا تمرر شيئا، وهي أول ما يحذف حين تضيق مساحة القرص.

مساء الخميس

ما تمسكه كل طبقة، وما تمرره كما هو

أربع طبقات بين تغيير ومعرض يسجل طلباته على ورق، وكل طبقة شفافة تماما للعطل الذي تمسكه التي بعدها.

  1. الاختباراتسلوك كان يعمل وصار لا يعملكل ما لم يخطر لأحد أن يصفه، وكل فرق بين بيئة وبيئة
  2. البناء من لا شيءالمكتبة غير المعلنة والمتغير المكتوب في ملف الصدفةكود خاطئ المعنى يبنى بلا شكوى
  3. الحاويةاختلاف الخادم والجهاز على نسخةالتغيير السيئ، بأمانة وبالتساوي، إلى كل مكان
  4. الإصدار السابق المحفوظكل ما مرته الثلاث قبلها، ريثما ينتبه أحدلا شيء، وهو الطبقة التي تحذف لتوفير مساحة
تغيير واحد، خارج

الختم هو الانتباه، وليس طبقة هنا. الأربع كلها تفترض أن أحدا سيعرف، ويوسف عرف لأن المعرض اتصل به.

الجدار: التسليم إلى عميل لا يفتح طرفية

الصفحة الإنجليزية المقابلة تفترض فريقا ومستودعا وخط بناء. وأكثر من يقرأ هذه الصفحة يعمل وحده ويسلم إلى عميل، وهذا يغير الموضوع لا يغير حجمه فقط.

العميل لا يفتح طرفية ولن يفتحها. واستضافته في الغالب مشتركة بلوحة تحكم وبرنامج FTP، ونصف ما يكتب عن النشر يفترض خادما يملكه ويدخل إليه. فالسؤال العملي ليس أي خط بناء أفضل، هو: من الذي يرجع الموقع الساعة الحادية عشرة ليلا حين تكون أنت في مشروع آخر أو خارج التغطية؟

والجواب المهني ثلاثة أشياء تسلم مع الموقع لا بعده: مستودع باسم العميل لا باسمك، ومجلدا الإصدارين الأخيرين محفوظان على الخادم، وصفحة واحدة مكتوبة بالعربية فيها أمر الرجوع كما يكتب حرفا بحرف. الثالث هو الذي يهمل دائما، وهو أرخص الثلاثة وأكثرها استعمالا. ومن سلم بلا هذه الثلاثة لم يسلم مشروعا، سلم اعتمادا عليه شخصيا، وهو ما يجعل العمل الحر ينقلب إلى مناوبة دائمة بلا أجر.

وإن كانت الاستضافة لا تعطي صدفة أصلا، فهذا يقال كما هو: تبقى نسخة الإصدار السابق في مجلد منفصل، ويحول جذر الموقع من اللوحة، وتلك أضعف حلقة في هذه الصفحة كلها وأول ما يستحق التغيير حين يكبر المشروع.

ثلاث أدوات، وواحدة منها لا تحتاج بطاقة

GitHub Actions هي خط البناء الافتراضي لمشروع صغير سنة 2026، وحلت محل Jenkins عند أكثر الفرق الصغيرة، وهو ما تعرضه الدروس الأقدم من 2019 تقريبا. تعمل من داخل المستودع بلا خادم تديره، ولها حصة مجانية شهرية للمستودعات الخاصة ولا حد للعامة، ولا تطلب بطاقة للبدء. هذه الجملة الأخيرة هي التي تجعلها المدخل العملي لقارئ في مصر أو الشام أو المغرب العربي.

وDocker هو الذي يبني الصورة، وحل محل قائمة مكتوبة بخطوات التنصيب لا يحدثها أحد. مجاني ومفتوح المصدر في نواته، ويعمل على الأجهزة الثلاثة، وسحب الصور الأساسية يفتح من الخليج ومصر والشام والمغرب العربي.

وrsync أقدمها وأنفعها في هذه السوق. حل محل سحب الملفات وإفلاتها في برنامج FTP، وهو ينقل ما تغير وحده، ويكتب إلى مجلد جديد بدل الكتابة فوق العامل، وهذا بالضبط ما كان ينقص يوسف. مجاني، ومنصب أصلا على كل خادم لينكس، ولا يحتاج حسابا عند أحد.

الخمسة تحت هذه الصفحة، والسؤال الذي يليها

الثلاثة الأولى تتعلم معا لا واحدة بعد واحدة، لأن كل واحدة منها بلا الأخريين قليلة النفع: الاختبارات بلا تاريخ لا تقول أي تغيير كسر ماذا، والتاريخ بلا بناء نظيف يسجل كودا يعمل على جهاز واحد. والحاويات هي البناء النظيف مغلفا في ملف، والتكامل والتسليم المستمران هي الأتمتة فوق الثلاثة، وتركب بعدها لا قبلها، وهذا الترتيب المعكوس هو أشيع خطأ في هذا الباب.

والنشر هو الموضع الذي يكتب فيه شكل الإصدارات والرابط الرمزي وأمر الرجوع. ومن أراد أن يقرأ هذا كله على مشروع صغير قبل أن يكبر فموضعه أساسيات البرمجة، فالأربعون سطرا تتعلم عليها هذه العادات أرخص من أربعة آلاف.

ويبقى سؤال يصل بعد أول رجوع ناجح. الكود رجع إلى ما كان عليه أمس في ثانية واحدة، والجداول لم ترجع: الطلبات التي دخلت اليوم موجودة، والعمود الذي أضيف صباحا ما يزال مضافا، وكود الأمس لا يعرفه. ما الذي يرجع البيانات، وكيف يكتب تغيير على جدول حي بحيث تعمل النسختان معه؟ جوابه في قواعد البيانات.

بجانب هذه العقدة

فوق هذه العقدة