أتمتة تحديث Dependencies بـ Renovate — إنهي صداع الـ package.json
لو فتحت مشروع فيه 50 dependency ولقيت 30 منهم متأخرين 6 شهور، معناه إن شخص لازم يقعد يفتح كل واحد يدوي، يقرأ الـ changelog، ويعمل PR. Renovate بيعمل ده أسبوعيًا من غير تدخّلك، بـ PRs صغيرة مرتّبة حسب الأولوية، وبتكلفة صفر على المشاريع العامة والخاصة.
المشكلة باختصار
الـ dependencies اللي ما بتتحدّتش بتتراكم في صمت. بعد 6 شهور بتلاقي 3 ثغرات أمنية (CVE) في حزم زي axios أو lodash. أول ما تحاول ترقّي يد بإيد، بتكتشف إن الـ breaking changes في React 18 مش بس في react-dom، كمان في 12 library مترابطة. النتيجة: PR ضخم فيه 80 ملف متغيّر، محدش قادر يراجعه، وبيفضل مفتوح لحد ما يقدم.
الـ trade-off هنا واضح: يا إما تحدّث كل أسبوع بخطوات صغيرة، يا إما كل 6 شهور بكارثة. Renovate بيخلّيك في الخيار الأول من غير ما تفتكر.
إزاي يشتغل Renovate — بمثال بسيط جدًا
تخيّل إن عندك فريق نظافة بيمرّ على مكتبك كل صبح اتنين. الفريق ده مش بيرمي أي حاجة من عنده، بس بيقولّك: "الصندوق ده عنده موديل أحدث، تحبّ أغيّره؟". انت بتبص على المحتوى وبتقول: آه أو لأ. لو قلت آه، هو بيعمل التغيير لوحده.
Renovate بيشتغل بنفس المنطق بالظبط. كل أسبوع بيفتح GitHub Pull Request لكل dependency عنده إصدار جديد. إنت بتفتح الـ PR، تلاقي فيه الـ release notes كاملة، تشوف الـ tests نجحت ولا لأ، وتعمل merge أو تقفل.
المفهوم بشكل تقني
Renovate هو GitHub App (ومتاح كمان على GitLab و Bitbucket و Azure DevOps) بيفحص ملفات الـ dependencies عندك دوريًا. بيدعم أكتر من 90 نوع ملف: package.json، requirements.txt، go.mod، Cargo.toml، Dockerfile، Terraform، GitHub Actions، وغيرهم. لمّا يلاقي إصدار جديد على npm أو PyPI أو Docker Hub، بيفتح branch، يعدّل الملف، يحدّث الـ lockfile بشكل سليم، ويفتح PR بالـ release notes داخل الوصف.
الأداة مجانية بالكامل لأي مشروع (public أو private). الشركة وراها Mend.io، ومشروع Renovate نفسه open-source تحت رخصة AGPL-3.0.
الإعداد خطوة بخطوة
- افتح
https://github.com/apps/renovateواضغط Install. - اختَر الـ repositories اللي عايز Renovate يشتغل عليها. ابدأ بـ repo تجريبي واحد، مش كلهم مرة واحدة.
- Renovate هيفتحلك PR اسمه "Configure Renovate" فيه ملف
renovate.jsonافتراضي. اعمله merge. - استنى من 6 لـ 24 ساعة. هيفتح أول دفعة PRs بالـ updates المتاحة.
ملف renovate.json عملي
الإعداد الافتراضي بيفتح PRs كتير جدًا ومش منظّم. دي نسخة معقولة لمشروع متوسط، جرّبناها على مشروع Next.js إنتاج:
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["config:recommended"],
"schedule": ["before 6am on monday"],
"timezone": "Africa/Cairo",
"prConcurrentLimit": 5,
"prHourlyLimit": 2,
"packageRules": [
{
"matchUpdateTypes": ["minor", "patch"],
"matchCurrentVersion": "!/^0/",
"automerge": true,
"automergeType": "pr",
"platformAutomerge": true
},
{
"matchPackagePatterns": ["^@types/"],
"groupName": "type definitions",
"automerge": true
},
{
"matchUpdateTypes": ["major"],
"dependencyDashboardApproval": true
}
],
"vulnerabilityAlerts": {
"enabled": true,
"labels": ["security"]
}
}المهم في الإعداد ده:
schedule: الـ PRs بتفتح يوم اتنين قبل الساعة 6 الصبح بتوقيت القاهرة. مش كل ساعة.prConcurrentLimit: 5: أقصى عدد PRs مفتوحة في نفس الوقت. بيمنع inbox الفريق من الإنفجار.automergeعلى minor و patch: لو الـ CI عدى، Renovate بيعمل merge تلقائيًا. الشرط!/^0/بيستثني الحزم اللي إصدارها بادئ بـ 0.x (لأن semver مش بيضمن استقرار فيها).- حزم
@types/*متجمّعة في PR واحد، لأنها مترابطة. - أي major update محتاج موافقة يدوية منك عبر الـ Dependency Dashboard.
- لو Renovate لقى ثغرة أمنية (CVE)، بيفتح PR فورًا، من غير انتظار الـ schedule.
رقم فعلي — تجربة على مشروع Next.js
مشروع حقيقي فيه 147 dependency. قبل Renovate: الترقية كانت بتحصل مرتين بس في 6 شهور، في PR ضخم بـ 80+ ملف متغيّر، محدش بيراجعه، وأحيانًا بيكسر الـ production.
بعد Renovate بالإعداد اللي فوق: متوسط 12 PR أسبوعي، كل PR أقل من 5 ملفات، 85% منهم بيتعمل لهم merge أوتوماتيك بعد ما الـ CI يعدي. الوقت المصروف على الـ dependencies هبط من 4 ساعات شهريًا لـ 25 دقيقة شهريًا تقريبًا. الـ CVE alerts اتحلّت في نفس اليوم بدل ما تفضل 3 أسابيع.
trade-offs — ما هتخسره
Renovate مش مجاني من غير تكلفة خفية:
- PRs أكتر في inbox الفريق. لو ما حطّتش
prConcurrentLimit، هتلاقي 40 PR مفتوح في أسبوعين. - استهلاك CI: كل PR بيشغّل الـ pipeline بالكامل. لو الـ CI بتدفع فيه بالدقيقة (زي GitHub-hosted runners على الخطة الـ Team)، راقب الفاتورة أول شهر. متوسط مشروع متوسط: 15-30 دولار زيادة شهريًا.
- الـ automerge خطير لو الـ tests ضعيفة. الافتراض إن عندك test suite بتغطّي على الأقل 60% من الـ critical paths. لو الـ coverage أقل من 40%، فعّل الـ automerge على حزم الـ types بس.
متى لا تستخدم Renovate
- مشروع مهجور مش بتحدّثه خالص. ما فيش لازمة ترقّيات.
- Monorepo ضخم فيه 200 service. Renovate ممكن يفتحلك 1000 PR في أول أسبوع. استخدم Dependabot بـ group mode، أو Renovate مع إعداد مخصوص لكل workspace.
- لو ما عندكش CI pipeline يكشف الـ regressions. PRs الـ minor ممكن تكسر production لو ما فيش تغطية اختبارات فعلية.
- مشاريع مقفولة بالكامل على إصدارات بعينها بسبب requirements تنظيمية (مثل FIPS أو HIPAA)، الترقية التلقائية ممكن تكسر الامتثال.
الخطوة التالية
اختار repo تجريبي صغير دلوقتي، ركّب Renovate، وامسح ملف renovate.json الافتراضي وحطّ مكانه النسخة اللي فوق. استنى أسبوع واحد، بعدها افتح الـ Insights في الـ repo واقيس: كام PR اتفتح؟ كام اتعملهم merge تلقائي؟ كام محتاج تدخّلك؟ لو النتيجة مرضية، وسّع على باقي الـ repos. لو PRs كتير بتفشل في الـ CI، رجّع الـ automerge إلى false وراجع الـ tests عندك الأول.