سطر واحد جعل الاستنساخ أسرع 100 مرة

وجد فريق تحسين الأداء لدينا تغييرًا صغيرًا كان له تأثير كبير على سرعة البناء عبر جميع خطوط الأنابيب. وجدنا أن تعيين المعلمة refspecفي الوقت المناسب git fetchيسرع خطوة الاستنساخ بمعامل 100.



تعتبر مجموعة الإنتاجية الهندسية مسؤولة عن دعم المهندسين الذين يقومون ببناء ونشر البرامج على Pinterest. يدعم فريقنا عددًا من خدمات البنية التحتية وغالبًا ما يعمل على مشاريع كبيرة - حيث يقوم بترحيل جميع البرامج إلى Bazel ، وإنشاء منصة توصيل مستمرة تسمى Hermez . كما أنهم يدعمون المستودعات الأحادية ، حيث يرسلون عدة مئات من الالتزامات كل يوم ، وهذا ليس كل مهامهم.



نحن نعمل بجد لجعل تطوير البرامج وتسليمها على Pinterest سريعًا وغير مؤلم. في الآونة الأخيرة ، أظهرت الحياة مرة أخرى مدى التأثير الكبير الذي يمكن أن تحدثه حتى أصغر التفاصيل. لقد وجدنا تفاصيل صغيرة في Git قللت بشكل كبير من أوقات البناء في خطوط أنابيب التكامل المستمر. لفهم كيف كان لهذا التغيير الصغير مثل هذا التأثير الكبير ، نحتاج إلى مشاركة بعض المعلومات حول المستودعات الأحادية وخطوط الأنابيب لدينا.



المستودعات الأحادية والناقلات



لدينا ستة مستودعات رئيسية على Pinterest: Pinboard و Optimus و Cosmos و Magnus و iOS و Android. هذه كلها مستودعات أحادية مع مجموعة واسعة من الخدمات الخاصة باللغة. Pinboard هو أكبر مستودع منفرد تم الحفاظ عليه منذ تأسيس الشركة. يحتوي على أكثر من 350 ألف عملية التزام ويبلغ حجمه 20 جيجابايت عند استنساخه بالكامل.



يستغرق استنساخ مستودع أحادي يحتوي على الكثير من التعليمات البرمجية وتاريخ طويل الكثير من الوقت ، وفي خطوط أنابيب التكامل المستمر ، يتعين علينا القيام بذلك كثيرًا خلال اليوم. بالنسبة إلى Pinboard وحدها ، نصنع أكثر من 60 ألف عنصر في أيام الأسبوع.git pull... تبدأ معظم البرامج النصية لتكوين خط أنابيب Jenkins (المكتوبة في Groovy) بخطوة Checkout ، حيث نقوم باستنساخ المستودع ، الذي سيتم بناؤه واختباره في خطوات لاحقة. إليك ما تبدو عليه مرحلة Checkout النموذجية:







إذا كنت تستخدم Git CLI مباشرة:







``

حتى مع الاستنساخ غير المكتمل / الضحل ، دون استخراج أي علامات وفقط في آخر 50 عملية ، فإن العملية لم تتم بأسرع ما يمكن. هذا لأننا لم نقم بتعيين المعلمة refspec . لاحظ أن غياب هذه المعلمة يعني الأمر لاسترداد جميع refspecs: + refs / heads / *: refs / remotes / origin / * . في حالة Pinboard ، تتم معالجة أكثر من 2500 فرع.



ببساطة عن طريق إضافة خيار refspec وتحديد الروابط التي نهتم بها (في حالتنا ، فقط من الرئيسي) ، يمكنك قصر نطاق المعالجة على الفرع المطلوب وتوفير الكثير من الوقت. إليك ما يبدو عليه في خط الأنابيب لدينا:







أدى تغيير بسيط في سطر واحد إلى تقليل وقت الاستنساخ بمعامل 100 ، ونتيجة لذلك ، قلل بشكل كبير من وقت الإنشاء . تم تقليل وقت الاستنساخ لأكبر مستودع Pinboard من 40 دقيقة إلى 30 ثانية. هذا يدل على أنه في بعض الأحيان حتى أصغر جهد يحدث فرقًا كبيرًا.



All Articles