قبل الدفع · فصل ٧

الـ CI يعيد الفحص بره اللابتوب

GitHub Actions · npm ci · prettier --check · eslint · test
🎯 الهدف: تكتب خط فحص يرفض الدفع لو التنسيق أو اللنت أو الاختبار وقع، من غير ما يعدّل الملفات.

المرآة والباب

على جهازك: الحفظ ينسّق، والـ commit يشغّل Husky. ده المرآة. بعد git push، سيرفر يشغّل نفس الفحص على نسخة نظيفة من المستودع. ده الباب.

الـ CI ميستخدمش --write ولا --fix. لو استخدمهم، هيعدّل ملفات على السيرفر ومحدش هياخد التعديل، والفحص هيعدي على شكل مش هو اللي اتدفع. السيرفر يحكم بس.

—check و eslint من غير —fix و npm test. أي واحد بغير صفر، الدفع يترفض.

خط على GitHub Actions

الملف يتحط في .github/workflows/check.yml. الأسماء تتراجع في صفحة كل action لأن الإصدار بيتغير.

.github/workflows/check.yml
name: checkon: [push, pull_request]jobs:  quality:    runs-on: ubuntu-latest    steps:      - uses: actions/checkout@v4      - uses: actions/setup-node@v4        with:          node-version: 22          cache: npm      - run: npm ci      - run: npx prettier --check .      - run: npx eslint .      - run: npm test

npm ci يثبّت اللي في ملف القفل بالظبط، وميرفعش إصدارات. npm install على السيرفر ممكن يحل شجرة مختلفة عن جهازك. لو الفريق على pnpm، الخطوة المقابلة pnpm install --frozen-lockfile، والكاش يتظبط على pnpm. راجع صفحة setup-node.

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

ليه الباب مش اختياري؟

git commit --no-verify يعدّي Huskyنسخة قديمة من غير prepare متظبطتش الـ hooksملف اتعدل بعد الـ commit ومتدفعش من نفس الفحص

الثلاثة دول يعدّوا المرآة. الـ CI شايف الكوميت اللي على الفرع، مش اللي أنت فاكره على الجهاز. عشان كده الفحص على السيرفر هو اتفاق الفريق، مش إعداد محرر شخصي.

خلّصت الفصل لما

🧠 اختبر نفسك
١) ليه CI ميشغّلش prettier --write؟
عشان ميعدّلش الملفات على السيرفر. المطلوب حكم على اللي اتدفع.
٢) npm ci مختلف عن npm install إزاي؟
ci يثبّت ملف القفل كما هو. install ممكن يحل إصدارات تانية.
٣) الـ commit عدى بـ --no-verify. إيه اللي لسه ممكن يرفضه؟
خطوة الـ CI على الـ push أو الـ pull request.