مستوى المقال: متوسط — تحتاج تكون شغّال على مشروع فيه مكتبات خارجية (npm أو pip أو غيرهم) وتعرف أساسيات Git والـ Pull Requests.
أتمتة تحديث الاعتماديات بـ Renovate: مكتبات محدّثة بدون ما تكسر الإنتاج
لو بتأجّل تحديث مكتبات مشروعك لحد ما تتجمّع، انت بتحوّل شغل 5 دقايق أسبوعيًا إلى يوم كامل من إصلاح الأعطال كل 6 شهور. Renovate بيقلب المعادلة: بيفتح لك Pull Requests صغيرة ومنتظمة، ويدمج الآمن منها لوحده بعد ما الاختبارات تعدّي.
المشكلة باختصار
كل مكتبة بتعتمد عليها بتطلع إصدارات جديدة: إصلاحات أمان، تصحيح باجات، ومزايا. لو سِبتها، بيتراكم عندك دين تقني بيتحوّل لثغرة أمنية أو ترقية مؤلمة. المشكلة مش التحديث نفسه، المشكلة إنك بتعمله دفعة واحدة كبيرة في أسوأ وقت.
تخيّلها بالعربية: صيانة العربية
خلّينا نبسّطها بمثال. عربيتك محتاجة تغيير زيت كل فترة. لو غيّرت الزيت بانتظام (حاجة بسيطة كل شوية)، العربية بتفضل ماشية. لكن لو قلت "هأجّلها"، هتفضل تأجّل لحد ما الموتور يضرب، وساعتها التصليح بيكلّفك ضعف التمن ويوقّفك أيام.
تحديث المكتبات هو بالظبط تغيير الزيت ده. التحديثات الصغيرة المنتظمة (patch وminor) رخيصة وسهلة المراجعة. الترقية الكبيرة المؤجَّلة (major متراكمة) هي الموتور اللي ضرب.
التعريف العلمي
المكتبات بتتبع الإصدار الدلالي (Semantic Versioning) بصيغة MAJOR.MINOR.PATCH. زيادة الـ PATCH معناها إصلاح متوافق للخلف. زيادة الـ MINOR معناها ميزة جديدة متوافقة. زيادة الـ MAJOR معناها كسر محتمل في التوافق. Renovate بيقرأ ملفات الاعتماديات (زي package.json والـ lockfiles)، بيقارن إصداراتك بأحدث المتاح، وبيفتح PR لكل تحديث أو مجموعة تحديثات حسب قواعدك.
إزاي Renovate بيشتغل
- يفحص ملفات الاعتماديات والـ lockfiles في الريبو.
- يكتشف الإصدارات الأحدث ويجيب معاها ملاحظات الإصدار وسجل التغييرات.
- يجمّع ويفتح PR حسب قواعدك وفي المواعيد اللي حدّدتها (مثلًا فجر الاثنين بس).
- يشغّل الـ CI على الـ PR زي أي تغيير عادي.
- يدمج تلقائيًا التحديثات الآمنة (patch/minor) لو الاختبارات خضراء.
الإعداد العملي
حط ملف renovate.json في جذر الريبو. ده إعداد واقعي: يدمج الـ patch والـ minor تلقائيًا، يوقف الـ major للمراجعة اليدوية، ويعطي أولوية لتحديثات الأمان.
{
"extends": ["config:recommended"],
"timezone": "Africa/Cairo",
"schedule": ["after 2am and before 6am on monday"],
"prConcurrentLimit": 5,
"packageRules": [
{
"matchUpdateTypes": ["patch", "minor"],
"automerge": true
},
{
"matchUpdateTypes": ["major"],
"automerge": false,
"labels": ["major-update"]
}
],
"vulnerabilityAlerts": {
"labels": ["security"],
"automerge": true
}
}افتراض مهم: خلّي الدمج التلقائي للـ patch والـ minor بس، وسيب الـ major للمراجعة اليدوية لأنه ممكن يكسر التوافق. وللمكتبات اللي لسه في إصدار 0.x خلّي بالك، لأن الـ SemVer فيها مش مضمون والـ minor ممكن يكسر.
لو مش عايز تركّب تطبيق Renovate الجاهز على GitHub، شغّله بنفسك عبر GitHub Actions:
name: Renovate
on:
schedule:
- cron: "0 2 * * 1"
workflow_dispatch:
jobs:
renovate:
runs-on: ubuntu-latest
steps:
- uses: renovatebot/github-action@v40.1.0
with:
token: ${{ secrets.RENOVATE_TOKEN }}
env:
RENOVATE_REPOSITORIES: your-org/your-repoالأرقام والـ trade-offs
خُد سيناريو واقعي: فريق من 6 مطورين على ريبو فيه 40 اعتمادية. من غير أتمتة، كانوا بيعملوا ترقية شاملة كل ~6 شهور، بتاخد يوم عمل كامل (8 ساعات) في إصلاح ما يكسر، مع مخاطرة تعطيل الإنتاج. مع Renovate بيوصلهم في المتوسط 6 إلى 10 PRs صغيرة أسبوعيًا، الـ patch/minor منها بيتدمج لوحده، والباقي مراجعته دقيقتين لكل PR.
النتيجة التقديرية: بدل 8 ساعات كل 6 شهور في دفعة مخاطرة، بقى ~20 دقيقة أسبوعيًا مراجعة موزّعة (حوالي 8.5 ساعة في نصف سنة). الساعات متقاربة، لكن الفرق الحقيقي في المخاطرة: التحديث الصغير لو كسر، بتعرف المكتبة المسؤولة فورًا؛ التحديث الكبير لو كسر، بتدوّر وسط 40 تغيير.
الـ trade-off هنا صريح: بتكسب أمان محدّث ومراجعة سهلة وتشخيص أسرع للأعطال. بتخسر هدوء الـ inbox — هيوصلك ضجيج PRs، ولو الـ CI بتاعك ضعيف أو بطيء، الدمج التلقائي ممكن يعدّي عطل. Renovate بيقوى بقد قوة اختباراتك.
متى لا تستخدم Renovate
متفعّلش الدمج التلقائي لو مالكش تغطية اختبارات كافية — ساعتها انت بتدمج المجهول. متستخدموش على مشروع مهجور مش هتصونه، أو على مكتبات 0.x حرجة في الإنتاج. ولو الفريق صغير جدًا ومشروع تجريبي، ممكن Dependabot (المدمج في GitHub) يكفيك بدون تعقيد إعداد.
الخطوة التالية
افتح ريبو واحد فيه اختبارات كويسة، ضيف ملف renovate.json اللي فوق، وفعّل تطبيق Renovate عليه من GitHub Marketplace. سيبه أسبوع، وبُص كام PR وصلك وكام اتدمج لوحده. لو عدد الـ PRs كتير عليك، زوّد التجميع بـ groupName في الـ packageRules. ابدأ بريبو واحد، مش المؤسسة كلها.
المصادر
- توثيق Renovate الرسمي — الإعداد والـ automerge وpackageRules: docs.renovatebot.com
- مواصفة الإصدار الدلالي Semantic Versioning 2.0.0: semver.org
- GitHub Dependabot — البديل المدمج: docs.github.com/dependabot
- OWASP Top 10 — A06:2021 المكونات القديمة والمصابة بثغرات: owasp.org
- Renovate GitHub Action: github.com/renovatebot/github-action