Renovate Bot: حدّث dependencies تلقائيًا بدون ما تكسر الإنتاج
لو فريقك بيستلم 40 Pull Request أسبوعيًا من Dependabot بس علشان version bumps، المشكلة مش في كمية التحديثات، المشكلة في شكلها. Renovate بيحول نفس الـ 40 PR إلى 5 أو 6 PRs مجمّعة، مع automerge بعد اختبارات ناجحة، ودashboard واحد يعرض كل dependency متأخر في كل repo.
المشكلة باختصار
أي مشروع production فيه 100 إلى 500 dependency مباشر، وضعفهم أو أربع أضعافهم من الـ transitive dependencies. كل أسبوع بتطلع patch updates لـ 10 أو 20 منهم. لو فريقك بيستخدم Dependabot بإعداد افتراضي، ده معناه 10 إلى 20 PR جديد كل أسبوع لكل repo. والنتيجة اللي بتحصل فعلاً: المهندسين بيعملوا approve/merge على السريع بدون ما يقرأوا الـ changelog، أو بيتجاهلوا الـ PRs لحد ما تتكدس 150 PR معلقة والـ base branch بتبقى متأخرة شهرين.
مثال بسيط قبل ما ندخل في التفاصيل
تخيل إنك طباخ في مطعم كبير. كل يوم المطعم بيستهلك 30 مكون مختلف: طحين، سكر، زيت، بهارات. كل أسبوع، المصانع بتطلع نسخة أنقى من المنتج (patch update). لو المصانع بتبعتلك رسالة SMS لكل مكون لوحده ("الطحين الجديد جاهز"، "السكر الجديد جاهز"...)، هتقضي ساعات تقرأ الرسايل وتقرر أي مكون تشتري.
Dependabot بيشتغل كده بالظبط: رسالة SMS لكل مكون. Renovate Bot بيتصرّف زي مدير مخزن ذكي: بيعمل قائمة أسبوعية واحدة فيها كل التحديثات، بيتأكد إن المكونات أقل من أسبوعين بالفعل (منعًا للشوائب)، ولو كلهم patches آمنة بيشتريهم أوتوماتيكيًا ويضيفهم للمخزن من غير ما يتعبك.
تقنيًا، Renovate بيعمل ده عن طريق 3 آليات: Grouping (تجميع PRs من نفس النوع)، Scheduling (تشغيل في أوقات محددة)، و Automerge (دمج تلقائي بعد CI ناجح + فترة انتظار).
Renovate vs Dependabot: الفرق اللي بيوفر ساعات
Dependabot هو المنتج المدمج من GitHub. بيدعم 30+ ecosystem وبيشتغل مباشرةً من ملف .github/dependabot.yml. Renovate مفتوح المصدر من Mend، بيدعم 90+ ecosystem، وبيشتغل على GitHub و GitLab و Bitbucket و Azure DevOps و Gitea. الفروق العملية:
- Grouping built-in: Renovate عنده presets جاهزة تجمع kubernetes-related أو react-related dependencies في PR واحد. Dependabot بتحتاج تكتب قاعدة يدوية لكل مجموعة.
- Automerge مدمج: بتضيف
"automerge": trueفي package rule، Renovate بيستنى الـ CI ثم يدمج. Dependabot محتاج GitHub Action منفصل يستخدمdependabot/fetch-metadata. - Dependency Dashboard: Issue واحد في كل repo بيعرض كل dependency متأخر مع السبب لو Renovate مش قادر يحدثه. مفيش ما يشبهه في Dependabot.
- Shared config presets: بتكتب config واحد في repo اسمه
renovate-config، وكل الـ repos الباقية بترث منه بـ"extends": ["local>your-org/renovate-config"]. توحيد السياسة عبر 50 repo يبقى سطر واحد.