রিমোট এক্সিকিউশনের জন্য বেজেল নিয়মগুলিকে অভিযোজিত করা

এই পৃষ্ঠাটি Bazel ব্যবহারকারীদের জন্য কাস্টম বিল্ড এবং পরীক্ষার নিয়ম লিখছেন যারা দূরবর্তী সম্পাদনের প্রসঙ্গে Bazel নিয়মগুলির প্রয়োজনীয়তাগুলি বুঝতে চান৷

রিমোট এক্সিকিউশন ব্যাজেলকে একটি পৃথক প্ল্যাটফর্ম, যেমন একটি ডেটাসেন্টারে অ্যাকশন চালানোর অনুমতি দেয়। Bazel তার দূরবর্তী সম্পাদনের জন্য একটি gRPC প্রোটোকল ব্যবহার করে। আপনি bazel-buildfarm এর সাথে রিমোট এক্সিকিউশন চেষ্টা করতে পারেন, একটি ওপেন-সোর্স প্রকল্প যার লক্ষ্য একটি বিতরণ করা রিমোট এক্সিকিউশন প্ল্যাটফর্ম প্রদান করা।

বিভিন্ন পরিবেশের ধরন বা প্ল্যাটফর্ম উল্লেখ করার সময় এই পৃষ্ঠাটি নিম্নলিখিত পরিভাষা ব্যবহার করে:

  • হোস্ট প্ল্যাটফর্ম - যেখানে বেজেল চলে।
  • এক্সিকিউশন প্ল্যাটফর্ম - যেখানে ব্যাজেল অ্যাকশন চলে।
  • টার্গেট প্ল্যাটফর্ম - যেখানে বিল্ড আউটপুট (এবং কিছু অ্যাকশন) চলে।

ওভারভিউ

দূরবর্তী সম্পাদনের জন্য একটি Bazel বিল্ড কনফিগার করার সময়, আপনাকে অবশ্যই এই পৃষ্ঠায় বর্ণিত নির্দেশিকাগুলি অনুসরণ করতে হবে যাতে বিল্ডটি দূরবর্তীভাবে ত্রুটি-মুক্তভাবে কার্যকর হয়। এটি দূরবর্তী সম্পাদনের প্রকৃতির কারণে, যথা:

  • বিচ্ছিন্ন বিল্ড কর্ম. বিল্ড সরঞ্জামগুলি অবস্থা ধরে রাখে না এবং নির্ভরতা তাদের মধ্যে ফুটো করতে পারে না।

  • বিভিন্ন মৃত্যুদন্ড পরিবেশন. স্থানীয় বিল্ড কনফিগারেশন সবসময় রিমোট এক্সিকিউশন পরিবেশের জন্য উপযুক্ত নয়।

এই পৃষ্ঠাটি দূরবর্তী সম্পাদনের জন্য কাস্টম বেজেল বিল্ড এবং পরীক্ষার নিয়মগুলি প্রয়োগ করার সময় উদ্ভূত সমস্যাগুলি বর্ণনা করে এবং কীভাবে সেগুলি এড়াতে হয়। এটি নিম্নলিখিত বিষয়গুলি কভার করে:

টুলচেইনের নিয়মের মাধ্যমে বিল্ড টুলের আহ্বান করা

একটি Bazel টুলচেইন নিয়ম হল একটি কনফিগারেশন প্রদানকারী যেটি একটি বিল্ড রুল বলে যে কোন বিল্ড টুলগুলি যেমন কম্পাইলার এবং লিঙ্কারগুলি ব্যবহার করতে হবে এবং কিভাবে নিয়মের স্রষ্টার দ্বারা সংজ্ঞায়িত প্যারামিটার ব্যবহার করে কনফিগার করতে হবে। একটি টুলচেন নিয়ম বিল্ড এবং পরীক্ষার নিয়মগুলিকে অনুমানযোগ্য, পূর্ব কনফিগার করা পদ্ধতিতে বিল্ড টুলগুলিকে ব্যবহার করার অনুমতি দেয় যা দূরবর্তী সম্পাদনের সাথে সামঞ্জস্যপূর্ণ। উদাহরণ স্বরূপ, PATH , JAVA_HOME , বা অন্যান্য স্থানীয় ভেরিয়েবলের মাধ্যমে বিল্ড টুল ব্যবহার করার পরিবর্তে একটি টুলচেন নিয়ম ব্যবহার করুন যা দূরবর্তী কার্যকরী পরিবেশে সমতুল্য মান (বা মোটেও) সেট করা যাবে না।

স্কালা , রাস্ট , এবং গো -এর জন্য ব্যাজেল বিল্ড এবং পরীক্ষার নিয়মগুলির জন্য টুলচেন নিয়ম বর্তমানে বিদ্যমান রয়েছে এবং অন্যান্য ভাষা ও সরঞ্জাম যেমন ব্যাশের জন্য নতুন টুলচেন নিয়ম চলছে। আপনার নিয়ম যে টুলটি ব্যবহার করে তার জন্য যদি টুলচেন নিয়ম বিদ্যমান না থাকে, তাহলে একটি টুলচেন নিয়ম তৈরি করার কথা বিবেচনা করুন।

অন্তর্নিহিত নির্ভরতা পরিচালনা করা

যদি একটি বিল্ড টুল বিল্ড অ্যাকশন জুড়ে নির্ভরতা অ্যাক্সেস করতে পারে, তবে দূরবর্তীভাবে চালানো হলে সেই ক্রিয়াগুলি ব্যর্থ হবে কারণ প্রতিটি দূরবর্তী বিল্ড অ্যাকশন অন্যদের থেকে আলাদাভাবে চালানো হয়। কিছু বিল্ড টুল বিল্ড অ্যাকশন এবং অ্যাক্সেস নির্ভরতা জুড়ে অবস্থা ধরে রাখে যা টুল ইনভোকেশনে স্পষ্টভাবে অন্তর্ভুক্ত করা হয়নি, যা দূরবর্তীভাবে কার্যকর করা বিল্ড অ্যাকশনগুলিকে ব্যর্থ করে দেবে।

উদাহরণস্বরূপ, যখন Bazel একটি স্টেটফুল কম্পাইলারকে স্থানীয়ভাবে foo তৈরি করার নির্দেশ দেয়, তখন কম্পাইলার foo-এর বিল্ড আউটপুটগুলির রেফারেন্স ধরে রাখে। যখন Bazel তখন কম্পাইলারকে বার তৈরি করার নির্দেশ দেয়, যা foo- এর উপর নির্ভর করে, কম্পাইলার আহ্বানে অন্তর্ভুক্তির জন্য BUILD ফাইলে যে নির্ভরতা স্পষ্টভাবে উল্লেখ না করে, ততক্ষণ পর্যন্ত একই কম্পাইলার ইনস্ট্যান্স উভয় অ্যাকশনের জন্য কার্যকর হয় (যেমনটি সাধারণ) স্থানীয় মৃত্যুদন্ডের জন্য)। যাইহোক, যেহেতু দূরবর্তী এক্সিকিউশন পরিস্থিতিতে প্রতিটি বিল্ড অ্যাকশন একটি পৃথক কম্পাইলার উদাহরণ কার্যকর করে, তাই foo- এর উপর কম্পাইলার স্টেট এবং বারের অন্তর্নিহিত নির্ভরতা হারিয়ে যাবে এবং বিল্ড ব্যর্থ হবে।

এই নির্ভরতা সমস্যাগুলি সনাক্ত করতে এবং নির্মূল করতে সাহায্য করার জন্য, Bazel 0.14.1 স্থানীয় ডকার স্যান্ডবক্স অফার করে, যা দূরবর্তী সম্পাদনের মতো নির্ভরতাগুলির জন্য একই সীমাবদ্ধতা রয়েছে। নির্ভরতা-সম্পর্কিত বিল্ড ত্রুটি সনাক্ত এবং সমাধান করে দূরবর্তী সম্পাদনের জন্য আপনার বিল্ড প্রস্তুত করতে স্যান্ডবক্স ব্যবহার করুন। আরও তথ্যের জন্য ডকার স্যান্ডবক্সের সাথে ব্যাজেল রিমোট এক্সিকিউশন সমস্যা সমাধান দেখুন।

প্ল্যাটফর্ম-নির্ভর বাইনারি পরিচালনা

সাধারণত, সম্ভাব্য অমিল নির্ভরতার কারণে হোস্ট প্ল্যাটফর্মে নির্মিত একটি বাইনারি নির্বিচারে দূরবর্তী এক্সিকিউশন প্ল্যাটফর্মে নিরাপদে কার্যকর করতে পারে না। উদাহরণস্বরূপ, Bazel এর সাথে সরবরাহ করা SingleJar বাইনারি হোস্ট প্ল্যাটফর্মকে লক্ষ্য করে। যাইহোক, রিমোট এক্সিকিউশনের জন্য, SingleJar আপনার কোড তৈরির প্রক্রিয়ার অংশ হিসাবে কম্পাইল করা আবশ্যক যাতে এটি রিমোট এক্সিকিউশন প্ল্যাটফর্মকে লক্ষ্য করে। ( লক্ষ্য নির্বাচন যুক্তি দেখুন।)

আপনার সোর্স কোডের সাথে আপনার বিল্ডের জন্য প্রয়োজনীয় বিল্ড টুলগুলির বাইনারিগুলি পাঠাবেন না যদি না আপনি নিশ্চিত হন যে সেগুলি আপনার কার্যকরী প্ল্যাটফর্মে নিরাপদে চলবে। পরিবর্তে, নিম্নলিখিতগুলির মধ্যে একটি করুন:

  • টুলের জন্য সোর্স কোড পাঠান বা বাহ্যিকভাবে উল্লেখ করুন যাতে এটি দূরবর্তী এক্সিকিউশন প্ল্যাটফর্মের জন্য তৈরি করা যায়।

  • রিমোট এক্সিকিউশন এনভায়রনমেন্টে (উদাহরণস্বরূপ, একটি টুলচেন কন্টেইনার) টুলটি যথেষ্ট স্থিতিশীল হলে আগে থেকে ইনস্টল করুন এবং আপনার বিল্ডে এটি চালানোর জন্য টুলচেন নিয়ম ব্যবহার করুন।

কনফিগার-স্টাইল ওয়ার্কস্পেস নিয়ম পরিচালনা করা

Bazel এর WORKSPACE নিয়মগুলি বিল্ডের জন্য প্রয়োজনীয় সরঞ্জাম এবং লাইব্রেরিগুলির জন্য হোস্ট প্ল্যাটফর্মের অনুসন্ধানের জন্য ব্যবহার করা যেতে পারে, যা স্থানীয় বিল্ডগুলির জন্যও Bazel এর এক্সিকিউশন প্ল্যাটফর্ম। যদি বিল্ডটি স্পষ্টভাবে স্থানীয় বিল্ড টুল এবং আর্টিফ্যাক্টের উপর নির্ভর করে, রিমোট এক্সিকিউশন প্ল্যাটফর্ম হোস্ট প্ল্যাটফর্মের সাথে অভিন্ন না হলে এটি রিমোট এক্সিকিউশনের সময় ব্যর্থ হবে।

WORKSPACE নিয়ম দ্বারা সম্পাদিত নিম্নলিখিত ক্রিয়াগুলি দূরবর্তী সম্পাদনের সাথে সামঞ্জস্যপূর্ণ নয়:

  • বাইনারি বিল্ডিং. WORKSPACE নিয়মে কম্পাইলেশন অ্যাকশন চালানোর ফলে বাইনারি হয় যা হোস্ট প্ল্যাটফর্ম থেকে ভিন্ন হলে রিমোট এক্সিকিউশন প্ল্যাটফর্মের সাথে বেমানান।

  • pip প্যাকেজ ইনস্টল করা হচ্ছে। WORKSPACE নিয়মের মাধ্যমে ইনস্টল করা pip প্যাকেজগুলির জন্য তাদের নির্ভরতাগুলি হোস্ট প্ল্যাটফর্মে আগে থেকে ইনস্টল করা প্রয়োজন। হোস্ট প্ল্যাটফর্মের জন্য বিশেষভাবে নির্মিত এই ধরনের প্যাকেজ, হোস্ট প্ল্যাটফর্ম থেকে ভিন্ন হলে দূরবর্তী এক্সিকিউশন প্ল্যাটফর্মের সাথে বেমানান হবে।

  • স্থানীয় সরঞ্জাম বা শিল্পকর্মের সাথে সিমলিংক করা। WORKSPACE নিয়মের মাধ্যমে তৈরি হোস্ট প্ল্যাটফর্মে ইনস্টল করা টুল বা লাইব্রেরির সিমলিঙ্কগুলি দূরবর্তী এক্সিকিউশন প্ল্যাটফর্মে বিল্ডটিকে ব্যর্থ করে দেবে কারণ Bazel তাদের সনাক্ত করতে সক্ষম হবে না। পরিবর্তে, স্ট্যান্ডার্ড বিল্ড অ্যাকশন ব্যবহার করে সিমলিঙ্ক তৈরি করুন যাতে সিমলিঙ্ক করা টুল এবং লাইব্রেরিগুলি runfiles ট্রি থেকে অ্যাক্সেসযোগ্য হয়। বহিরাগত রেপো ডিরেক্টরির বাইরে টার্গেট ফাইলগুলিকে সিমলিংক করতে repository_ctx.symlink ব্যবহার করবেন না।

  • হোস্ট প্ল্যাটফর্ম পরিবর্তন করা হচ্ছে। runfiles ট্রির বাইরে ফাইল তৈরি করা, এনভায়রনমেন্ট ভেরিয়েবল তৈরি করা এবং অনুরূপ অ্যাকশনগুলি এড়িয়ে চলুন, কারণ তারা দূরবর্তী এক্সিকিউশন প্ল্যাটফর্মে অপ্রত্যাশিতভাবে আচরণ করতে পারে।

সম্ভাব্য নন-হারমেটিক আচরণ খুঁজে পেতে সাহায্য করতে আপনি ওয়ার্কস্পেস নিয়ম লগ ব্যবহার করতে পারেন।

যদি একটি বাহ্যিক নির্ভরতা হোস্ট প্ল্যাটফর্মের উপর নির্ভরশীল নির্দিষ্ট ক্রিয়াকলাপগুলি সম্পাদন করে, তাহলে আপনার সেই ক্রিয়াকলাপগুলিকে WORKSPACE মধ্যে বিভক্ত করা উচিত এবং নিম্নলিখিত নিয়মগুলি তৈরি করা উচিত:

  • প্ল্যাটফর্ম পরিদর্শন এবং নির্ভরতা গণনা। এই ক্রিয়াকলাপগুলি WORKSPACE নিয়মগুলির মাধ্যমে স্থানীয়ভাবে চালানোর জন্য নিরাপদ, যা কোন লাইব্রেরিগুলি ইনস্টল করা আছে তা পরীক্ষা করতে পারে, প্যাকেজগুলি ডাউনলোড করতে হবে যা অবশ্যই তৈরি করতে হবে এবং সংকলনের জন্য প্রয়োজনীয় নিদর্শন প্রস্তুত করতে পারে৷ রিমোট এক্সিকিউশনের জন্য, এই নিয়মগুলিকে অবশ্যই হোস্ট প্ল্যাটফর্ম পরিদর্শনের সময় সাধারণত প্রাপ্ত তথ্য প্রদানের জন্য পূর্ব-চেক করা আর্টিফ্যাক্ট ব্যবহার করে সমর্থন করতে হবে। প্রি-চেক করা আর্টিফ্যাক্টগুলি Bazelকে নির্ভরতা বর্ণনা করতে দেয় যেন সেগুলি স্থানীয়। এর জন্য শর্তসাপেক্ষ বিবৃতি বা --override_repository পতাকা ব্যবহার করুন।

  • লক্ষ্য-নির্দিষ্ট শিল্পকর্ম এবং প্ল্যাটফর্ম মিউটেশন তৈরি বা সংকলন করা । এই ক্রিয়াকলাপগুলি অবশ্যই নিয়মিত বিল্ড নিয়মের মাধ্যমে কার্যকর করা উচিত। বাহ্যিক নির্ভরতার জন্য লক্ষ্য-নির্দিষ্ট নিদর্শন তৈরি করে এমন ক্রিয়াগুলি নির্মাণের সময় কার্যকর করতে হবে।

রিমোট এক্সিকিউশনের জন্য আরও সহজে প্রি-চেক করা আর্টিফ্যাক্ট তৈরি করতে, আপনি জেনারেট করা ফাইলগুলি নির্গত করতে WORKSPACE নিয়ম ব্যবহার করতে পারেন। আপনি প্রতিটি নতুন এক্সিকিউশন এনভায়রনমেন্টে এই নিয়মগুলি চালাতে পারেন, যেমন প্রতিটি টুলচেন কন্টেইনারের ভিতরে, এবং রেফারেন্সের জন্য আপনার সোর্স রেপোতে আপনার রিমোট এক্সিকিউশনের আউটপুটগুলি পরীক্ষা করে দেখুন।

উদাহরণস্বরূপ, cuda এবং python এর জন্য Tensorflow এর নিয়মগুলির জন্য, WORKSPACE নিয়মগুলি নিম্নলিখিত BUILD files তৈরি করে৷ স্থানীয় সম্পাদনের জন্য, হোস্ট পরিবেশ পরীক্ষা করে উত্পাদিত ফাইলগুলি ব্যবহার করা হয়। রিমোট এক্সিকিউশনের জন্য, এনভায়রনমেন্ট ভেরিয়েবলের একটি শর্তসাপেক্ষ বিবৃতি নিয়মটিকে রেপোতে চেক করা ফাইলগুলি ব্যবহার করার অনুমতি দেয়।

BUILD ফাইলগুলি এমন genrules ঘোষণা করে যা স্থানীয়ভাবে এবং দূরবর্তীভাবে চলতে পারে এবং প্রয়োজনীয় প্রক্রিয়াকরণ সম্পাদন করে যা আগে এখানে দেখানো হয়েছে repository_ctx.symlink এর মাধ্যমে করা হয়েছিল।