تعديل قواعد Bazel للتنفيذ عن بُعد

هذه الصفحة مُخصَّصة لمستخدمي Bazel الذين يكتبون قواعد مخصّصة للإصدار والاختبار يريدون فهم متطلبات قواعد Bazel في سياق التنفيذ عن بُعد.

يسمح التنفيذ عن بُعد لشركة Bazel بتنفيذ الإجراءات على منصّة منفصلة، مثل مركز بيانات. يستخدم Bazel بروتوكول gRPC لتنفيذ البرنامج عن بُعد. يمكنك محاولة التنفيذ عن بُعد باستخدام bazel-buildfarm، وهو مشروع مفتوح المصدر يهدف إلى توفير منصة مُنفَذة للتنفيذ عن بُعد.

تستخدم هذه الصفحة المصطلحات التالية عند الإشارة إلى أنواع مختلفة أو منصات مختلفة:

  • المنصة الأساسية: منصّة Bazel
  • منصّة التنفيذ: المكان الذي يتمّ فيه تنفيذ إجراءات Bazel.
  • النظام الأساسي المستهدف: حيث يتم تشغيل مخرجات الإصدار (وبعض الإجراءات).

نظرة عامة

عند ضبط إصدار Bazel للتنفيذ عن بُعد، عليك اتّباع الإرشادات الموضّحة في هذه الصفحة لضمان تنفيذ الإصدار عن بُعد بدون أخطاء. ويرجع ذلك إلى طبيعة التنفيذ عن بُعد، وهي:

  • إجراءات الإصدار المعزولة. لا تحتفظ أدوات الإصدار بحالة الاعتمادات ولا يمكن للتبعيات التسرب بينها.

  • أحد بيئات التنفيذ المتنوعة. ولا تكون تهيئة الإصدار المحلي مناسبة دائمًا لبيئات التنفيذ عن بُعد.

تصف هذه الصفحة المشاكل التي قد تنشأ عند تنفيذ قواعد Bazel المخصّصة واختبار قواعد التنفيذ عن بُعد وكيفية تجنّبها. ويتناول الفيديو المواضيع التالية:

استدعاء أدوات الإنشاء من خلال قواعد سلسلة الأدوات

إنّ قاعدة سلسلة مفاتيح Bazel هي موفّر ضبط يُعلم قاعدة إنشاء أدوات الإنشاء، مثل برامج التحويل البرمجي والروابط، لاستخدامها وكيفية إعدادها باستخدام المعلمات التي يحددها منشئ القاعدة. تسمح قاعدة سلسلة الأدوات بإنشاء القواعد واختبارها لاستدعاء أدوات الإصدار بطريقة متوقعة ويمكن إعدادها مسبقًا ومتوافقة مع التنفيذ عن بُعد. على سبيل المثال، استخدِم قاعدة سلسلة من الأدوات بدلاً من استدعاء أدوات الإصدار من خلال PATH أو JAVA_HOME أو غيرها من المتغيّرات المحلية التي لا يمكن ضبطها على قيم مكافئة (أو على الإطلاق) في وحدة التحكّم عن بُعد. بيئة التنفيذ.

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

إدارة العناصر التابعة الضمنية

إذا تمكّنت إحدى أدوات الإصدار من الوصول إلى العناصر الاعتمادية في إجراءات الإصدار، سيتعذّر تنفيذها عند تنفيذها عن بُعد لأنّها تنفّذ بشكل منفصل عن غيرها من الإجراءات. تحتفظ بعض أدوات الإصدار بحالة الإصدار على مستوى إجراءات الإصدار والوصول إلى العناصر التابعة التي لم يتم تضمينها بشكل صريح في استدعاء الأداة، ما يؤدي إلى تعذّر تنفيذ إجراءات الإصدار عن بُعد.

على سبيل المثال، عندما يُصدر "بازيل" تعليمات إلى المجمّع الفاعل لإنشاء foo محليًا، يحتفظ المجمّع بمراجع لإخراجات الإصدار من foo. عندما يُصدر "بازل" تعليمات إلى المجمّع لإنشاءبار ، بناءً علىفو ، بدون ذكر صراحةً أن التبعية في ملف BUILD لتضمينها في استدعاء المجمّع، يتم تنفيذ الإجراء بنجاح طالما أن المثيل البرمجي نفسه يتم تنفيذه في كلا الإجراءين (كما هو الحال عادةً في التنفيذ المحلي). ولكن، في كل سيناريو للتنفيذ عن بُعد، ينفِّذ كل إجراء من إجراءات الإصدار مثالاً منفصلاً لمجمّع البرامج، سيتم فقدان حالة أداة التجميع واعتمادية بار الضمنية على foo. وسيفشل الإصدار.

للمساعدة في اكتشاف مشاكل التبعية هذه وإزالتها، يوفّر Bazel 0.14.1 وضع الحماية على Docker المحلي الذي يفرض قيودًا مماثلة على عمليات التنفيذ عن بُعد. ويمكنك استخدام وضع الحماية لإعداد الإصدار للتنفيذ عن بُعد من خلال تحديد أخطاء الإصدار المرتبطة بالتبعية وحلّها. لمزيد من المعلومات، يمكنك الاطّلاع على تحديد مشاكل التنفيذ عن بُعد في Bazel باستخدام Docker Sandbox.

إدارة البرامج الثنائية التي تعتمد على النظام الأساسي

عادةً، لا يمكن تنفيذ برنامج ثنائي تم إنشاؤه على النظام الأساسي المضيف بأمان على منصة تنفيذ عن بُعد عشوائية بسبب تبعيات يُحتمل أن تكون غير متطابقة. على سبيل المثال، يستهدف برنامج SingleJar الثنائي المُقدَّم مع Bazel النظام الأساسي للمضيف. ومع ذلك، بالنسبة إلى التنفيذ عن بُعد، يجب تجميع SingleJar كجزء من عملية إنشاء الرمز حتى يستهدف النظام الأساسي للتنفيذ عن بُعد. (اطلع على منطق التحديد المستهدف).

لا تشحن رموز الإصدار الثنائية من أدوات الإصدار المطلوبة من خلال رمز المصدر ما لم تكن متأكدًا من أنها ستعمل بأمان في النظام الأساسي للتنفيذ. بدلاً من ذلك، نفذ أحد الإجراءات التالية:

  • يجب شحن رمز المصدر للأداة أو الإشارة إليه خارجيًا حتى يمكن إنشاؤه لمنصة التنفيذ عن بُعد.

  • يمكنك تثبيت الأداة مسبقًا في بيئة التنفيذ عن بُعد (على سبيل المثال، حاوية سلسلة أدوات) إذا كانت ثابتة بشكل كافٍ واستخدمت قواعد الأداة لتشغيلها في الإصدار.

إدارة قواعد ضبط نمط WORKSPACE

يمكن استخدام قواعد WORKSPACE في Bazel لفحص النظام الأساسي للمضيف للأدوات والمكتبات التي يتطلبها الإصدار، والتي تُعد أيضًا منصة تنفيذ بازل، بالنسبة إلى الإصدارات المحلية. إذا كان الإصدار يعتمد صراحةً على أدوات الإصدار وقطع العناصر المحلية، سيتعذّر تنفيذه أثناء التنفيذ عن بُعد إذا لم تكن منصة التنفيذ عن بُعد مطابقة للنظام الأساسي المضيف.

الإجراءات التالية التي يتم تنفيذها من خلال قواعد WORKSPACE غير متوافقة مع التنفيذ عن بُعد:

  • بناء البرامج الثنائية. ويؤدي تنفيذ إجراءات التجميع في قواعد WORKSPACE إلى ثنائية غير متوافقة مع النظام الأساسي للتنفيذ عن بُعد إذا كانت مختلفة عن النظام الأساسي للمضيف.

  • جارٍ تثبيت pip حزمة. تتطلب حِزم pip المُثبَّتة عبر قواعد WORKSPACE أن يتم تثبيت ارتباطاتها مسبقًا على النظام الأساسي للمضيف. وستكون هذه الحِزم، التي تم تصميمها خصيصًا للنظام الأساسي للمضيف، غير متوافقة مع النظام الأساسي للتنفيذ عن بُعد إذا كانت مختلفة عن النظام الأساسي للمضيف.

  • الربط بأدوات أو أدوات محلية. سيؤدي الروابط التلقائية للأدوات أو المكتبات المُثبّتة على النظام الأساسي للمضيف الذي تم إنشاؤه من خلال قواعد WORKSPACE إلى تعذُّر إنشاء الإصدار على النظام الأساسي للتنفيذ عن بُعد نظرًا لعدم قدرة Bazel على تحديد مكانها. بدلاً من ذلك، يمكنك إنشاء روابط رمزية باستخدام إجراءات الإصدار العادي بحيث يمكن الوصول إلى الأدوات والمكتبات المرتبطة من خلال شجرة runfiles في Bazel. لا تستخدم repository_ctx.symlink لربط الملفات المستهدفة خارج دليل Repo الخارجي.

  • إيقاف النظام الأساسي للمضيف تجنَّب إنشاء ملفات خارج شجرة Bazel runfiles وإنشاء متغيّرات بيئة وإجراءات مشابهة، لأنّها قد تعمل بشكل غير متوقّع على منصّة التنفيذ عن بُعد.

للمساعدة في العثور على السلوك المحتمل غير المهيئ، يمكنك استخدام سجل قواعد Workspace.

في حال كانت الاعتمادية الخارجية تنفِّذ عمليات محدّدة تعتمد على النظام الأساسي للمضيف، عليك تقسيم هذه العمليات بين WORKSPACE وإنشاء قواعد على النحو التالي:

  • تعدّد النظام الأساسي وعدد العناصر الاعتمادية. وتُعدّ هذه العمليات آمنة للتنفيذ محليًا من خلال قواعد WORKSPACE التي يمكنها التحقق من المكتبات التي تم تثبيتها وتنزيل الحزم التي يجب إنشاؤها وإعداد العناصر المطلوبة لتجميعها. وبالنسبة إلى التنفيذ عن بُعد، يجب أيضًا أن تتيح هذه القواعد استخدام عناصر فنية تمّ التحقق منها مسبقًا لتوفير المعلومات التي يتم الحصول عليها عادةً أثناء فحص النظام الأساسي للمضيف. إنّ العناصر المدرَجة مسبقًا تتيح للبازيل وصف التبعية كما لو كانت محلية. استخدِم العبارات المشروطة أو علامة --override_repository لهذا الإجراء.

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

لإنشاء عناصر مُحدَّدة مسبقًا بسهولة أكبر للتنفيذ عن بُعد، يمكنك استخدام قواعد WORKSPACE لإرسال الملفات التي تم إنشاؤها. يمكنك تشغيل هذه القواعد في كل بيئة تنفيذ جديدة، مثل كل حاوية سلسلة أدوات، والتحقق من مخرجات عملية التنفيذ عن بُعد في تقرير المصدر للرجوع إليها.

على سبيل المثال، بالنسبة إلى قواعد TensorFlow للسمة cuda وpython، تنتج قواعد WORKSPACE ما يلي BUILD files وبالنسبة إلى التنفيذ المحلي، يتم استخدام الملفات الناتجة عن التحقُّق من بيئة المضيف. بالنسبة إلى التنفيذ عن بُعد، يسمح الشرط المشروط على متغيّر البيئة للقاعدة باستخدام الملفات التي يتم التحقُّق منها في إعادة التسجيل.

تُعلن ملفات BUILD عن genrules إمكانية التشغيل محليًا وعن بُعد، فضلاً عن إجراء المعالجة اللازمة التي تم إجراؤها سابقًا من خلال repository_ctx.symlink كما هو موضح هنا.