التحليل الساكن وبوابات الجودة
التحليل الساكن وبوابات الجودة
كل خط CI يُشغّل الاختبارات — لكن الاختبارات تُغطّي فقط المسارات التي فكّرت في اختبارها. التحليل الساكن يفحص الكود المصدري دون تشغيله، ويكتشف فئة مختلفة تماماً من المشاكل: مخالفات الأسلوب، وأخطاء الأنواع، والأنماط الأمنية الخطيرة، والكود الميت، وتعقيد الديون التقنية. بوابات الجودة هي طبقة السياسات فوق ذلك: مجموعة حدود يجب أن تجتازها جميعاً قبل السماح لخط الـ pipeline بالدمج. معاً يُشكّلان آلية التطبيق التي تمنع قاعدة الكود الكبيرة من التدهور بينما يُودع مئات المهندسين يومياً.
في Google وMeta وAmazon، التحليل الساكن ليس اختيارياً أو استشارياً — إنه بوابة pipeline صارمة. الـ commit الذي يُسقط تغطية الاختبارات دون الحد المتفق عليه، أو الذي يُدخل نمطاً أمنياً سيئاً معروفاً، يُحجب تلقائياً. لا يحتاج إنسان للمراجعة ليقول لا؛ يقول خط الـ pipeline لا.
المُدقِّقات (Linters): تطبيق الأسلوب والصحة
المُدقِّق (Linter) يُحلل كودك ويُبلّغ عن الانحرافات عن مجموعة قواعد محددة. تنقسم القواعد إلى فئتين: أسلوبية (المسافات البادئة، طول السطر، اتفاقيات التسمية) وصحية (استخدام واجهات برمجية مهملة، متغيرات غير مستخدمة، كود غير قابل للوصول). تشغيل المُدقِّق في CI — لا مجرد في IDE — يضمن تطبيق القواعد على كل مهندس، لا على الواعيين منهم فقط.
اختيارات المُدقِّقات الشائعة حسب البيئة:
- JavaScript/TypeScript:
eslintمع مجموعة قواعد الفريق (Airbnb أو Google أو مخصصة) - Python:
ruff(بديل سريع مكتوب بـ Rust لـ flake8 + isort + pyupgrade) - Go:
golangci-lint— مُدقِّق شامل يُشغّل 50+ مُدقِّقاً بالتوازي - Java:
Checkstyle+SpotBugs - البنية التحتية:
tflintلـ Terraform، وhadolintلملفات Dockerfile
في بيئات big-tech، فشل التدقيق يُوقف خط الـ pipeline، وليس مجرد تحذير. يخرج job CI بكود غير صفري ولا يمكن دمج الـ PR. أي قاعدة تسمح بأن تكون "استشارية" سيتجاهلها نصف الفريق في نهاية المطاف.
package.json أو requirements.txt واحفظ التثبيت في ذاكرة التخزين المؤقت بـ CI. إصدار latest متحرك لمُدقِّق يكتسب قاعدة جديدة يُعطّل بنائك في يوم الجمعة مساءً دون أي تغيير في الكود — تنبيه زائف كلاسيكي يُضعف الثقة في خط الـ pipeline.
المُنسِّقات (Formatters): القضاء على نقاشات الأسلوب
المُنسِّق (Formatter) أقوى من المُدقِّق للأسلوب — يُعيد كتابة الكود إلى شكل قياسي بدلاً من الإشارة إليه فقط. أكثر تأثير لاعتماد مُنسِّق هو اختفاء نقاشات الأسلوب من مراجعة الكود. لا أحد يتجادل حول موضع الأقواس حين يكون المُنسِّق السلطة الوحيدة.
المُنسِّقات الشائعة: prettier (JS/TS/CSS/HTML)، وblack (Python)، وgofmt (Go، مدمج في سلسلة الأدوات)، وrustfmt (Rust). في CI تُشغّل المُنسِّق في وضع الفحص (يخرج بكود غير صفري إذا كان أي ملف سيتغير) لا في وضع إعادة الكتابة:
حدود التغطية: تطبيق الاستثمار في الاختبارات
تغطية الاختبارات تقيس نسبة قاعدة الكود التي تمارسها حزمة اختباراتك. تتبّعها أمر أساسي؛ تطبيق حدّ أدنى كبوابة جودة هو ما يمنع التغطية من التدهور فعلياً بمرور الوقت.
تعمل البوابة هكذا: إذا كان PR سيُسقط التغطية الإجمالية دون الحدّ (مثلاً 80%)، يفشل job CI. يجب على المؤلف إضافة اختبارات قبل أن يمكن دمج الـ PR. هذا يخلق دورة فضيلة — الكود الجديد يُشحن دائماً مع اختبارات، ولا يمكن لأرضية التغطية أن تنخفض.
أمثلة تطبيق التغطية حسب البيئة:
SAST: الأمان داخل خط الـ Pipeline
اختبار أمان التطبيقات الساكن (SAST) يُطبّق قواعد أمنية محددة على كودك المصدري. يكتشف أنماطاً مثل SQL injection، وبيانات الاعتماد المُضمّنة في الكود، والتسلسل غير الآمن، وحقن الأوامر، واستخدام واجهات التشفير المهملة — قبل أن يصل أيٌّ منها إلى بيئة تشغيل.
أدوات SAST حسب اللغة:
- متعددة اللغات: Semgrep (قائم على القواعد، سريع جداً، إخراج SARIF لـ GitHub)، وCodeQL (GitHub Advanced Security، تحليل تدفق البيانات العميق)
- Python: Bandit
- Java/Kotlin: SpotBugs + مكوِّن Find Security Bugs، وقواعد Semgrep Java
- JavaScript: npm audit (ثغرات CVE للتبعيات) + Semgrep
- Containers: Trivy (فحص صورة + نظام الملفات بحثاً عن CVEs والأسرار)
GitHub يوفر CodeQL مجاناً للمستودعات العامة وكجزء من GitHub Advanced Security للمستودعات الخاصة. Semgrep Community مجاني لأي مستودع. كحدٍّ أدنى، يجب أن يُشغّل كل pipeline فحص CVE للتبعيات (npm audit --audit-level=high، وpip-audit، وtrivy fs .) وأداة SAST واحدة.
تجميع خط بوابة الجودة
بوابة الجودة لا تُجدي إلا بقدر تطبيقها. النمط في شركات big-tech: تشغيل جميع jobs التحليل الساكن بالتوازي، واشتراط نجاحها جميعاً قبل السماح بالدمج، وتهيئة قواعد حماية الفروع بحيث لا يستطيع أحد — ولا أصحاب المستودع أنفسهم — تجاوزها.
أنماط الفشل الشائعة وكيفية تجنبها
1. معاملة تحذيرات التدقيق على أنها استشارية. إذا خرج مُدقِّقك بكود 0 مع تحذيرات، يتعلم المهندسون تجاهلها. اضبط --max-warnings 0 أو ما يعادله من البداية. التحذير الذي يُتجاهل صامتاً ستة أشهر ليس تحذيراً — إنه دين تقني بلا صاحب.
2. حدّ تغطية إجمالي يُكافئ الحشو. الفرق تحت الضغط تكتب اختبارات تستدعي دوالاً دون تأكيد أي شيء، ما يُضخّم أرقام التغطية دون إضافة أي قيمة. قاوم ذلك بدمج التغطية مع نقاط المُطفِّر (mutation score)، وبمراجعة التغطية على الوحدات الحرجة لا على الإجمالي فقط.
3. ضجيج SAST يُسبّب إرهاق التنبيهات. أداة SAST بمعدل إيجابية كاذبة 30% ستُكتم من المهندسين في غضون أسبوع. ابدأ بمجموعة قواعد صغيرة عالية الدقة (OWASP Top 10، الأسرار المُضمّنة) ووسّعها تدريجياً. كل قاعدة تُضيفها يجب التحقق منها: شغّلها على تاريخ مستودعك وقِس معدل الإيجابية الكاذبة قبل تطبيقها.
4. بوابات جودة يمكن تجاوزها. قواعد حماية الفروع مفيدة فقط إذا كان خيار تجاوز المسؤول مُعطَّلاً — أو إذا كانت التجاوزات مُسجَّلة ومُراجَعة. "سندمج مباشرة تحت الضغط" هو كيف تنهار كل بوابة جودة في نهاية المطاف. أتمتة عملية الاستثناء: سير عمل لحالات الطوارئ يتطلب موافقاً ثانياً ويُرسل تنبيهاً لمدير الهندسة.
pre-commit (أداة Python تُدير hooks لأي لغة). هذا يكتشف غالبية المخالفات قبل الـ push، فيكون CI للتطبيق لا الاكتشاف. يحصل المهندسون على ردود أفعال أسرع، ولا يُهدر وقت CI على فشل التنسيق.
في الدرس 6 ستنتقل من جودة الكود إلى إدارة الأدوات المُنتَجة (artifacts) — ما تبنيه في CI، وكيف تُصدره بإصدار، وكيف تُخزّنه بحيث يمكن لمراحل النشر اللاحقة استهلاكه بشكل موثوق.