تطبیق قوانین Bazel برای اجرای از راه دور

این صفحه برای کاربران Bazel در نظر گرفته شده است که قوانین ساخت و تست سفارشی را می نویسند و می خواهند الزامات قوانین Bazel را در زمینه اجرای از راه دور درک کنند.

اجرای از راه دور به Bazel اجازه می دهد تا اقدامات را در یک پلت فرم جداگانه، مانند یک مرکز داده، اجرا کند. Bazel از پروتکل gRPC برای اجرای از راه دور خود استفاده می کند. می توانید اجرای از راه دور را با bazel-buildfarm امتحان کنید، یک پروژه منبع باز که هدف آن ارائه یک پلت فرم اجرای از راه دور توزیع شده است.

این صفحه هنگام اشاره به انواع محیط یا پلتفرم های مختلف از اصطلاحات زیر استفاده می کند:

  • پلت فرم میزبان - جایی که Bazel اجرا می شود.
  • پلت فرم اعدام - جایی که اقدامات Bazel اجرا می شود.
  • پلت فرم هدف - جایی که خروجی های ساخت (و برخی اقدامات) اجرا می شوند.

بررسی اجمالی

هنگام پیکربندی یک ساخت Bazel برای اجرای از راه دور، باید دستورالعمل‌های توضیح داده شده در این صفحه را دنبال کنید تا مطمئن شوید که ساخت بدون خطا از راه دور اجرا می‌شود. این به دلیل ماهیت اجرای از راه دور است، یعنی:

  • اقدامات ساخت جدا شده ابزارهای ساخت حالت را حفظ نمی کنند و وابستگی ها نمی توانند بین آنها نشت پیدا کنند.

  • محیط های اجرایی متنوع پیکربندی ساخت محلی همیشه برای محیط های اجرای از راه دور مناسب نیست.

این صفحه مشکلاتی را که ممکن است هنگام اجرای ساخت و قوانین آزمایشی سفارشی Bazel برای اجرای از راه دور ایجاد شود و نحوه اجتناب از آنها توضیح می دهد. موضوعات زیر را پوشش می دهد:

فراخوانی ابزارهای ساخت از طریق قوانین زنجیره ابزار

یک قانون زنجیره ابزار Bazel یک ارائه دهنده پیکربندی است که به یک قانون ساخت می گوید که از چه ابزارهای ساختمانی مانند کامپایلرها و لینک کننده ها استفاده کند و چگونه آنها را با استفاده از پارامترهای تعریف شده توسط سازنده قانون پیکربندی کند. یک قانون زنجیره ابزار به قوانین ساخت و آزمایش اجازه می دهد تا ابزارهای ساخت را به شیوه ای قابل پیش بینی و از پیش تنظیم شده فراخوانی کنند که با اجرای از راه دور سازگار است. به عنوان مثال، به جای فراخوانی ابزارهای ساخت از طریق PATH ، JAVA_HOME یا سایر متغیرهای محلی که ممکن است روی مقادیر معادل (یا اصلاً) در محیط اجرای از راه دور تنظیم نشده باشند، از یک قانون زنجیره ابزار استفاده کنید.

قوانین Toolchain در حال حاضر برای قوانین ساخت و تست Bazel برای Scala , Rust , و Go وجود دارد و قوانین جدید Toolchain برای زبان ها و ابزارهای دیگر مانند bash در دست اجرا است. اگر یک قانون زنجیره ابزار برای ابزاری که قانون شما استفاده می کند وجود ندارد، ایجاد یک قانون زنجیره ابزار را در نظر بگیرید.

مدیریت وابستگی های ضمنی

اگر یک ابزار ساخت بتواند به وابستگی‌ها در بین اکشن‌های ساخت دسترسی داشته باشد، این اقدامات زمانی که از راه دور اجرا می‌شوند با شکست مواجه می‌شوند، زیرا هر اقدام ساخت از راه دور جداگانه از سایرین اجرا می‌شود. برخی از ابزارهای ساخت، حالت را در بین اقدامات ساخت و وابستگی‌های دسترسی که به صراحت در فراخوانی ابزار گنجانده نشده‌اند، حفظ می‌کنند، که باعث می‌شود اقدامات ساخت از راه دور اجرا شده با شکست مواجه شوند.

به عنوان مثال، هنگامی که Bazel به یک کامپایلر حالت دار دستور می دهد که foo را به صورت محلی بسازد، کامپایلر ارجاعاتی به خروجی های ساخت foo را حفظ می کند. هنگامی که Bazel به کامپایلر دستور می دهد تا نوار را بسازد، که به foo بستگی دارد، بدون اینکه صریحاً این وابستگی را در فایل BUILD برای گنجاندن در فراخوانی کامپایلر بیان کند، تا زمانی که همان نمونه کامپایلر برای هر دو عمل اجرا شود (همانطور که معمول است) عمل با موفقیت اجرا می شود. برای اجرای محلی). با این حال، از آنجایی که در یک سناریوی اجرای از راه دور، هر اقدام ساخت، یک نمونه کامپایلر جداگانه را اجرا می‌کند، وابستگی ضمنی حالت کامپایلر و نوار به foo از بین می‌رود و بیلد با شکست مواجه می‌شود.

برای کمک به شناسایی و حذف این مشکلات وابستگی، Bazel 0.14.1 سندباکس محلی Docker را ارائه می‌کند که محدودیت‌های مشابهی برای وابستگی‌ها مانند اجرای از راه دور دارد. از sandbox برای آماده سازی ساخت خود برای اجرای از راه دور با شناسایی و رفع خطاهای ساخت مربوط به وابستگی استفاده کنید. برای اطلاعات بیشتر به عیب یابی Bazel Remote Execution با Docker Sandbox مراجعه کنید.

مدیریت باینری های وابسته به پلتفرم

به طور معمول، یک باینری ساخته شده بر روی پلت فرم میزبان نمی تواند به طور ایمن روی یک پلت فرم اجرای از راه دور دلخواه به دلیل وابستگی های بالقوه ناهماهنگ اجرا شود. به عنوان مثال، باینری SingleJar ارائه شده با Bazel، پلتفرم میزبان را هدف قرار می دهد. با این حال، برای اجرای از راه دور، SingleJar باید به عنوان بخشی از فرآیند ساخت کد شما کامپایل شود تا پلتفرم اجرای از راه دور را هدف قرار دهد. ( منطق انتخاب هدف را ببینید.)

باینری از ابزارهای ساخت مورد نیاز ساخت خود را با کد منبع خود ارسال نکنید، مگر اینکه مطمئن باشید که آنها به طور ایمن در پلت فرم اجرای شما اجرا می شوند. در عوض، یکی از موارد زیر را انجام دهید:

  • کد منبع ابزار را ارسال کنید یا به صورت خارجی ارجاع دهید تا بتوان آن را برای پلت فرم اجرای از راه دور ساخت.

  • اگر ابزار به اندازه کافی پایدار است، از قبل در محیط اجرای از راه دور (به عنوان مثال، یک ظرف ابزار) نصب کنید و از قوانین زنجیره ابزار برای اجرای آن در ساخت خود استفاده کنید.

مدیریت قوانین WORKSPACE به سبک پیکربندی

قوانین WORKSPACE را می توان برای بررسی پلت فرم میزبان برای ابزارها و کتابخانه های مورد نیاز ساخت، که برای ساخت های محلی، پلت فرم اجرای Bazel نیز استفاده می کند. اگر ساخت صراحتاً به ابزارها و مصنوعات ساخت محلی بستگی داشته باشد، اگر پلت فرم اجرای از راه دور با پلت فرم میزبان یکسان نباشد، در حین اجرای از راه دور با شکست مواجه خواهد شد.

اقدامات زیر انجام شده توسط قوانین WORKSPACE با اجرای از راه دور سازگار نیستند:

  • ساختن باینری ها اجرای اقدامات کامپایل در قوانین WORKSPACE منجر به باینری هایی می شود که با پلت فرم اجرای از راه دور در صورتی که با پلتفرم میزبان متفاوت باشند، ناسازگار هستند.

  • نصب پکیج های pip بسته های pip نصب شده از طریق قوانین WORKSPACE مستلزم این است که وابستگی های آنها بر روی پلت فرم میزبان از قبل نصب شده باشد. چنین بسته هایی که به طور خاص برای پلتفرم میزبان ساخته شده اند، در صورتی که با پلتفرم میزبان متفاوت باشند، با پلتفرم اجرای از راه دور ناسازگار خواهند بود.

  • پیوند دادن به ابزارها یا مصنوعات محلی. پیوندهای نمادین به ابزارها یا کتابخانه‌های نصب شده بر روی پلتفرم میزبان ایجاد شده از طریق قوانین WORKSPACE باعث می‌شود که ساخت بر روی پلت فرم اجرای از راه دور با شکست مواجه شود زیرا Bazel قادر به یافتن آنها نخواهد بود. در عوض، با استفاده از اقدامات ساخت استاندارد، پیوندهای نمادین ایجاد کنید تا ابزارها و کتابخانه های سیملینک شده از درخت runfiles قابل دسترسی باشند. از repository_ctx.symlink برای پیوند دادن فایل های هدف خارج از فهرست مخزن خارجی استفاده نکنید.

  • جهش پلت فرم میزبان از ایجاد فایل‌های خارج از درخت runfiles ، ایجاد متغیرهای محیطی و اقدامات مشابه خودداری کنید، زیرا ممکن است رفتار غیرمنتظره‌ای روی پلت فرم اجرای از راه دور داشته باشند.

برای کمک به یافتن رفتار غیر هرمتیک بالقوه می‌توانید از گزارش قوانین فضای کاری استفاده کنید.

اگر یک وابستگی خارجی عملیات خاصی وابسته به پلتفرم میزبان را اجرا کند، باید آن عملیات را بین WORKSPACE و قوانین ساخت به صورت زیر تقسیم کنید:

  • بازرسی پلت فرم و شمارش وابستگی. اجرای این عملیات به صورت محلی از طریق قوانین WORKSPACE ایمن است، که می تواند بررسی کند کدام کتابخانه ها نصب شده اند، بسته هایی را که باید ساخته شوند دانلود کرده و مصنوعات مورد نیاز را برای کامپایل آماده کنند. برای اجرای از راه دور، این قوانین همچنین باید از استفاده از مصنوعات از پیش بررسی شده برای ارائه اطلاعاتی که معمولاً در طول بازرسی پلت فرم میزبان به دست می‌آیند، پشتیبانی کند. مصنوعات از قبل بررسی شده به Bazel اجازه می دهد تا وابستگی ها را به گونه ای توصیف کند که گویی محلی هستند. برای این کار از عبارات شرطی یا پرچم --override_repository استفاده کنید.

  • تولید یا کامپایل مصنوعات خاص هدف و جهش پلت فرم . این عملیات باید از طریق قوانین ساخت منظم اجرا شود. اقداماتی که مصنوعات خاص هدف را برای وابستگی های خارجی تولید می کنند باید در طول ساخت اجرا شوند.

برای تولید آسان‌تر مصنوعات از پیش بررسی‌شده برای اجرای از راه دور، می‌توانید از قوانین WORKSPACE برای انتشار فایل‌های تولید شده استفاده کنید. می‌توانید آن قوانین را در هر محیط اجرای جدید، مانند داخل هر ظرف ابزار زنجیره‌ای، اجرا کنید و خروجی‌های اجرای از راه دور خود را در مخزن منبع خود برای مرجع بررسی کنید.

به عنوان مثال، برای قوانین Tensorflow برای cuda و python ، قوانین WORKSPACE BUILD files زیر را تولید می کنند. برای اجرای محلی، از فایل های تولید شده با بررسی محیط میزبان استفاده می شود. برای اجرای از راه دور، یک دستور شرطی روی یک متغیر محیطی به قانون اجازه می‌دهد از فایل‌هایی استفاده کند که در مخزن بررسی می‌شوند.

فایل‌های BUILD genrules را اعلام می‌کنند که می‌توانند هم به صورت محلی و هم از راه دور اجرا شوند و پردازش لازم را که قبلاً از طریق repository_ctx.symlink انجام می‌شد ، انجام می‌دهند.