أتمتة تحديث 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"]
}
}