ذخیره سازی از راه دور

این صفحه کش از راه دور، راه اندازی یک سرور برای میزبانی کش و اجرای ساخت ها با استفاده از حافظه پنهان از راه دور را پوشش می دهد.

یک کش راه دور توسط تیمی از توسعه دهندگان و/یا یک سیستم یکپارچه سازی پیوسته (CI) برای به اشتراک گذاشتن خروجی های ساخت استفاده می شود. اگر ساخت شما قابل تکرار باشد، خروجی های یک ماشین را می توان با خیال راحت در ماشین دیگری دوباره استفاده کرد، که می تواند ساخت را به طور قابل توجهی سریعتر کند.

بررسی اجمالی

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

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

برای استفاده از حافظه پنهان از راه دور:

  • یک سرور را به عنوان پشتیبان کش تنظیم کنید
  • بیلد Bazel را برای استفاده از حافظه پنهان از راه دور پیکربندی کنید
  • از Bazel نسخه 0.10.0 یا بالاتر استفاده کنید

کش راه دور دو نوع داده را ذخیره می کند:

  • اکشن کش، که نقشه‌ای از هش‌های عمل به متادیتا نتیجه عمل است.
  • یک فروشگاه آدرس‌پذیر محتوا (CAS) از فایل‌های خروجی.

توجه داشته باشید که کش راه دور به علاوه stdout و stderr را برای هر عمل ذخیره می کند. بنابراین بازرسی stdout/stderr Bazel سیگنال خوبی برای تخمین بازدیدهای حافظه پنهان نیست.

چگونه یک بیلد از حافظه پنهان از راه دور استفاده می کند

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

  • خواندن و نوشتن در حافظه پنهان از راه دور
  • خواندن و/یا نوشتن در حافظه پنهان به جز برای اهداف خاص
  • فقط از حافظه پنهان از راه دور بخوانید
  • به هیچ وجه از حافظه پنهان از راه دور استفاده نکنید

هنگامی که یک بیلد Bazel را اجرا می کنید که می تواند در کش راه دور بخواند و بنویسد، بیلد این مراحل را دنبال می کند:

  1. Bazel نمودار اهدافی را که باید ساخته شوند ایجاد می کند و سپس لیستی از اقدامات مورد نیاز را ایجاد می کند. هر یک از این اقدامات دارای نام فایل های ورودی و خروجی هستند.
  2. Bazel ماشین محلی شما را برای خروجی های ساخت موجود بررسی می کند و هر آنچه را که پیدا می کند دوباره استفاده می کند.
  3. Bazel حافظه پنهان را برای خروجی های ساخت موجود بررسی می کند. اگر خروجی پیدا شود، بازل خروجی را بازیابی می کند. این یک ضربه کش است.
  4. برای اقدامات مورد نیاز که در آن خروجی ها یافت نشد، Bazel اقدامات را به صورت محلی اجرا می کند و خروجی های ساخت مورد نیاز را ایجاد می کند.
  5. خروجی های ساخت جدید در حافظه پنهان از راه دور آپلود می شوند.

راه اندازی یک سرور به عنوان پشتیبان کش

شما باید یک سرور راه اندازی کنید تا به عنوان پشتیبان کش عمل کند. سرور HTTP/1.1 می تواند داده های Bazel را به عنوان بایت های مات در نظر بگیرد و بسیاری از سرورهای موجود را می توان به عنوان پشتیبان ذخیره از راه دور استفاده کرد. پروتکل HTTP Caching Bazel چیزی است که از حافظه پنهان از راه دور پشتیبانی می کند.

شما مسئول انتخاب، راه اندازی و نگهداری سرور باطن هستید که خروجی های کش را ذخیره می کند. هنگام انتخاب سرور به موارد زیر توجه کنید:

  • سرعت شبکه به عنوان مثال، اگر تیم شما در همان دفتر است، ممکن است بخواهید سرور محلی خود را اجرا کنید.
  • امنیت. حافظه پنهان از راه دور دارای باینری های شما خواهد بود و بنابراین باید ایمن باشد.
  • سهولت مدیریت. به عنوان مثال، Google Cloud Storage یک سرویس کاملاً مدیریت شده است.

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

nginx

nginx یک وب سرور منبع باز است. با [ماژول WebDAV] خود، می توان از آن به عنوان یک کش راه دور برای Bazel استفاده کرد. در دبیان و اوبونتو می توانید بسته nginx-extras را نصب کنید. در macOS nginx از طریق Homebrew در دسترس است:

brew tap denji/nginx
brew install nginx-full --with-webdav

در زیر یک نمونه پیکربندی برای nginx آمده است. توجه داشته باشید که باید /path/to/cache/dir را به دایرکتوری معتبری تغییر دهید که در آن nginx اجازه نوشتن و خواندن را دارد. اگر فایل های خروجی بزرگتری دارید، ممکن است لازم باشد گزینه client_max_body_size را به مقدار بزرگتر تغییر دهید. سرور به تنظیمات دیگری مانند احراز هویت نیاز دارد.

پیکربندی نمونه برای بخش server در nginx.conf :

location /cache/ {
  # The path to the directory where nginx should store the cache contents.
  root /path/to/cache/dir;
  # Allow PUT
  dav_methods PUT;
  # Allow nginx to create the /ac and /cas subdirectories.
  create_full_put_path on;
  # The maximum size of a single file.
  client_max_body_size 1G;
  allow all;
}

بازل-ریموت

bazel-remote یک حافظه پنهان ساخت راه دور منبع باز است که می توانید در زیرساخت خود از آن استفاده کنید. از اوایل سال 2018 با موفقیت در تولید در چندین شرکت استفاده شده است. توجه داشته باشید که پروژه Bazel پشتیبانی فنی برای bazel-remote ارائه نمی دهد.

این کش محتویات را روی دیسک ذخیره می‌کند و همچنین جمع‌آوری زباله‌ها را برای اعمال محدودیت ذخیره‌سازی بالاتر و تمیز کردن مصنوعات استفاده نشده فراهم می‌کند. کش به صورت [تصویر docker] و کد آن در GitHub موجود است. هر دو API حافظه پنهان از راه دور REST و gRPC پشتیبانی می شوند.

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

Google Cloud Storage

[Google Cloud Storage] یک فروشگاه اشیاء کاملاً مدیریت شده است که یک API HTTP را ارائه می دهد که با پروتکل حافظه پنهان از راه دور Bazel سازگار است. لازم است یک حساب Google Cloud با فعال بودن صورتحساب داشته باشید.

برای استفاده از Cloud Storage به عنوان حافظه پنهان:

  1. یک سطل ذخیره سازی ایجاد کنید . اطمینان حاصل کنید که نزدیکترین مکان سطل را انتخاب کرده اید، زیرا پهنای باند شبکه برای حافظه پنهان از راه دور مهم است.

  2. یک حساب سرویس برای Bazel ایجاد کنید تا در Cloud Storage احراز هویت شود. به ایجاد حساب سرویس مراجعه کنید .

  3. یک کلید JSON مخفی ایجاد کنید و سپس آن را برای احراز هویت به Bazel ارسال کنید. کلید را به طور ایمن ذخیره کنید، زیرا هر کسی که کلید را در اختیار دارد می تواند داده های دلخواه را در/از سطل GCS شما بخواند و بنویسد.

  4. با افزودن پرچم‌های زیر به دستور Bazel خود به فضای ذخیره‌سازی ابری متصل شوید:

    • URL زیر را با استفاده از پرچم به Bazel ارسال کنید: --remote_cache=https://storage.googleapis.com /bucket-name که در آن bucket-name نام سطل ذخیره سازی شما است.
    • کلید احراز هویت را با استفاده از پرچم: --google_credentials= /path/to/your/secret-key .json .json یا --google_default_credentials برای استفاده از Application Authentication ارسال کنید.
  5. می‌توانید فضای ذخیره‌سازی ابری را برای حذف خودکار فایل‌های قدیمی پیکربندی کنید. برای انجام این کار، به مدیریت چرخه های عمر شیء مراجعه کنید.

سرورهای دیگر

می‌توانید هر سرور HTTP/1.1 را که از PUT و GET پشتیبانی می‌کند، به‌عنوان پشتیبان کش راه‌اندازی کنید. کاربران موفقیت خود را با ذخیره سازی پشتیبان ها مانند Hazelcast ، Apache httpd و AWS S3 گزارش کرده اند.

احراز هویت

از نسخه 0.11.0 پشتیبانی از HTTP Basic Authentication به Bazel اضافه شد. شما می توانید یک نام کاربری و رمز عبور را از طریق URL حافظه پنهان از راه دور به Bazel ارسال کنید. سینتکس https://username:[email protected]:port/path است. توجه داشته باشید که HTTP Basic Authentication نام کاربری و رمز عبور را به صورت متن ساده از طریق شبکه منتقل می کند و بنابراین استفاده از آن با HTTPS بسیار مهم است.

پروتکل حافظه پنهان HTTP

Bazel از کش از راه دور از طریق HTTP/1.1 پشتیبانی می کند. پروتکل از نظر مفهومی ساده است: داده های باینری (BLOB) از طریق درخواست های PUT آپلود می شوند و از طریق درخواست های GET دانلود می شوند. ابرداده‌های نتیجه عمل در مسیر /ac/ و فایل‌های خروجی در مسیر /cas/ ذخیره می‌شوند.

به عنوان مثال، یک کش از راه دور را در نظر بگیرید که تحت http://localhost:8080/cache اجرا می شود. درخواست Bazel برای دانلود فراداده نتیجه عمل برای یک کنش با هش SHA256 01ba4719... به صورت زیر خواهد بود:

GET /cache/ac/01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b HTTP/1.1
Host: localhost:8080
Accept: */*
Connection: Keep-Alive

درخواست Bazel برای آپلود یک فایل خروجی با هش SHA256 15e2b0d3... در CAS به صورت زیر است:

PUT /cache/cas/15e2b0d3c33891ebb0f1ef609ec419420c20e320ce94c65fbc8c3312448eb225 HTTP/1.1
Host: localhost:8080
Accept: */*
Content-Length: 9
Connection: Keep-Alive

0x310x320x330x340x350x360x370x380x39

Bazel را با استفاده از حافظه پنهان از راه دور اجرا کنید

هنگامی که یک سرور به عنوان حافظه پنهان راه دور راه اندازی شد، برای استفاده از کش راه دور باید پرچم هایی را به دستور Bazel خود اضافه کنید. لیست تنظیمات و پرچم های آنها را در زیر مشاهده کنید.

همچنین ممکن است به تأیید هویت پیکربندی نیاز داشته باشید که مخصوص سرور انتخابی شما است.

ممکن است بخواهید این پرچم ها را در یک فایل .bazelrc اضافه کنید تا هر بار که Bazel را اجرا می کنید نیازی به تعیین آنها نداشته باشید. بسته به پویایی پروژه و تیم خود، می توانید پرچم ها را به فایل .bazelrc . اضافه کنید که عبارتند از:

  • در دستگاه محلی شما
  • در فضای کاری پروژه شما، با تیم به اشتراک گذاشته شده است
  • در سیستم CI

خواندن و نوشتن در حافظه پنهان از راه دور

مراقب باشید که چه کسی توانایی نوشتن در حافظه پنهان از راه دور را دارد. ممکن است بخواهید فقط سیستم CI شما قادر به نوشتن در حافظه پنهان راه دور باشد.

از پرچم زیر برای خواندن و نوشتن در حافظه پنهان از راه دور استفاده کنید:

build --remote_cache=http://your.host:port

علاوه بر HTTP ، پروتکل های زیر نیز پشتیبانی می شوند: HTTPS ، grpc ، grpcs .

از پرچم زیر علاوه بر پرچم بالا برای خواندن فقط از حافظه پنهان از راه دور استفاده کنید:

build --remote_upload_local_results=false

اهداف خاص را از استفاده از حافظه پنهان از راه دور حذف کنید

برای حذف اهداف خاص از استفاده از حافظه پنهان راه دور، هدف را با no-cache تگ کنید. مثلا:

java_library(
    name = "target",
    tags = ["no-cache"],
)

حذف محتوا از کش راه دور

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

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

ممکن است بخواهید محتوا را از حافظه پنهان حذف کنید:

  • پس از مسموم شدن کش یک کش تمیز ایجاد کنید
  • با حذف خروجی‌های قدیمی، میزان فضای ذخیره‌سازی مورد استفاده را کاهش دهید

سوکت های یونیکس

حافظه پنهان HTTP راه دور از اتصال از طریق سوکت های دامنه یونیکس پشتیبانی می کند. این رفتار شبیه به پرچم --unix-socket curl است. برای پیکربندی سوکت دامنه یونیکس از موارد زیر استفاده کنید:

   build --remote_cache=http://your.host:port
   build --remote_cache_proxy=unix:/path/to/socket

این ویژگی در ویندوز پشتیبانی نمی شود.

کش دیسک

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

build --disk_cache=path/to/build/cache

شما می توانید با استفاده از نام مستعار ~ یک مسیر خاص کاربر را به پرچم --disk_cache کنید (Bazel دایرکتوری اصلی کاربر فعلی را جایگزین می کند). این هنگام فعال کردن حافظه پنهان دیسک برای همه توسعه دهندگان یک پروژه از طریق فایل .bazelrc . بررسی شده در پروژه مفید است.

مشکلات شناخته شده

اصلاح فایل ورودی در حین ساخت

هنگامی که یک فایل ورودی در طول ساخت تغییر می کند، Bazel ممکن است نتایج نامعتبر را در حافظه پنهان از راه دور آپلود کند. می‌توانید تشخیص تغییر را با پرچم --experimental_guard_against_concurrent_changes کنید. هیچ مشکل شناخته شده ای وجود ندارد و به طور پیش فرض در نسخه بعدی فعال خواهد شد. برای به‌روزرسانی‌ها به [ شماره 3360] مراجعه کنید. به طور کلی، از اصلاح فایل های منبع در طول ساخت خودداری کنید.

متغیرهای محیطی که به یک عمل نشت می کنند

تعریف عمل شامل متغیرهای محیطی است. این می‌تواند برای اشتراک‌گذاری بازدیدهای حافظه پنهان از راه دور بین ماشین‌ها مشکل ایجاد کند. برای مثال، محیط‌هایی با متغیرهای $PATH مختلف، بازدیدهای حافظه پنهان را به اشتراک نمی‌گذارند. فقط متغیرهای محیطی که به صراحت از طریق --action_env در لیست سفید قرار گرفته اند در تعریف عمل گنجانده شده اند. بسته Debian/Ubuntu Bazel برای نصب /etc/bazel.bazelrc با لیست سفید متغیرهای محیطی از جمله $PATH استفاده می‌شود. اگر تعداد بازدیدهای کش کمتر از حد انتظار دریافت می کنید، بررسی کنید که محیط شما فایل قدیمی /etc/bazel.bazelrc باشد.

Bazel ابزارهای خارج از یک فضای کاری را ردیابی نمی کند

Bazel در حال حاضر ابزارهای خارج از یک فضای کاری را ردیابی نمی کند. اگر برای مثال، یک اکشن از کامپایلری از /usr/bin/ استفاده کند، ممکن است مشکل ایجاد شود. سپس، دو کاربر با کامپایلرهای مختلف نصب شده، به اشتباه بازدیدهای کش را به اشتراک می‌گذارند، زیرا خروجی‌ها متفاوت هستند اما هش عمل یکسانی دارند. برای به‌روزرسانی به شماره 4558 مراجعه کنید.

هنگام اجرای بیلدها در کانتینرهای docker، حالت افزایشی حافظه از بین می‌رود. در سمت سرور، Bazel یک حالت در حافظه را حفظ می کند که سرعت ساخت را افزایش می دهد. هنگام اجرای بیلدها در داخل کانتینرهای docker مانند CI، حالت حافظه از بین می رود و Bazel باید قبل از استفاده از حافظه پنهان از راه دور آن را بازسازی کند.