أتمتة تحديث تبعيات مشروعك بـ Renovate — إعدادات جاهزة وأرقام حقيقية
لو بتقضي ساعتين كل أسبوع في عمل bump لـ package.json وتشغيل npm install وإصلاح الكود اللي اتكسر بسبب نسخة جديدة، Renovate Bot بيختصر الشغل ده لمراجعة PR واحد صبحًا في 5 دقايق. المقال ده بيوريك الإعداد الكامل، الأرقام الفعلية من مشروع إنتاج، وإمتى Renovate مش هيكون الخيار الصح.
المشكلة باختصار
كل مكتبة في مشروعك بتتحدّث كل أسبوعين تقريبًا، ومعظم التحديثات patch صغيرة. لو عندك 40 dependency، ده بيبقى ~80 تحديث شهريًا. لو مهمّلتهمش، الـ CVEs بتتراكم جوا مكتباتك ومع الوقت بتبقى سطح هجوم كبير. لو بتعملهم يدوي، بتضيع يوم كامل كل أسبوع. Renovate بيحوّل العملية دي لـ PRs مجمّعة، بعضها يندمج أوتوماتيك بعد ما الـ CI يعدّي.
Renovate بمثال بسيط قبل التعريف التقني
تخيّل إنك مسؤول عن مخزن فيه 200 منتج، وكل منتج تاريخ انتهائه مختلف. الطريقة اليدوية: تروح كل صباح، تفتح كل منتج، وتشيك واحد واحد. الطريقة الذكية: موظف واحد بيمر الصبح، بيجمع المنتجات اللي هتنتهي قريب في قائمة واحدة، ويقولك "دي قائمة الأسبوع، راجعها مرة واحدة وامضي عليها". بدل 200 مراجعة صغيرة، بقيت مراجعة واحدة مركّزة.
Renovate هو الموظف ده، بس في مشروعك البرمجي. بدل ما يفتحلك PR لكل مكتبة اتحدّثت لوحدها، بيجمع كل مكتبات من نفس العيلة (زي كل إضافات ESLint أو كل حزم AWS SDK) في PR واحد، ويبعتلك تجميعة واحدة في الأسبوع بدل 20 PR متفرقين.
التعريف التقني
Renovate Bot أداة مفتوحة المصدر من شركة Mend (كانت WhiteSource) بتحلل ملفات الـ manifest في المشروع — زي package.json، requirements.txt، go.mod، Dockerfile، وملفات GitHub Actions — وبتقارنهم بأحدث إصدار متاح في الـ registry المناسب. لما تلاقي فرق، بتفتح PR فيه التحديث + changelog + نتيجة الـ CI. بتدعم أكتر من 90 package manager على GitHub و GitLab و Bitbucket و Azure DevOps و Gitea.
الإعداد الكامل في 4 خطوات
- ادخل على
github.com/apps/renovateواضغط Install، وحدد المستودعات اللي عايز تفعّله عليها. - Renovate هيفتحلك تلقائيًا "Configure Renovate" PR بيضيف ملف
renovate.jsonفي الـ root. - عدّل الإعدادات من المثال تحت حسب مشروعك، وادمج الـ PR.
- أول PRs تحديث هتبدأ تظهر خلال ساعة من الدمج.
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["config:best-practices"],
"timezone": "Africa/Cairo",
"schedule": ["after 6am and before 10am on monday"],
"prHourlyLimit": 2,
"prConcurrentLimit": 5,
"packageRules": [
{
"matchUpdateTypes": ["patch", "minor"],
"matchCurrentVersion": "!/^0/",
"automerge": true,
"automergeType": "pr",
"platformAutomerge": true
},
{
"matchPackagePatterns": ["^eslint", "^@typescript-eslint/"],
"groupName": "ESLint packages",
"schedule": ["before 10am on monday"]
},
{
"matchUpdateTypes": ["major"],
"automerge": false,
"labels": ["dependencies", "major-update"]
}
],
"vulnerabilityAlerts": {
"labels": ["security"],
"automerge": true
}
}