ডকার স্যান্ডবক্সের সাথে ব্যাজেল রিমোট এক্সিকিউশনের সমস্যা সমাধান করা হচ্ছে

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

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

ডকার স্যান্ডবক্স বৈশিষ্ট্যটি নিম্নরূপ রিমোট এক্সিকিউশনের সীমাবদ্ধতাগুলিকে অনুকরণ করে:

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

  • কোন বহিরাগত তথ্য ধারক সীমানা অতিক্রম. শুধুমাত্র স্পষ্টভাবে ঘোষিত ইনপুট এবং আউটপুটগুলি কন্টেইনারে প্রবেশ করে এবং ছেড়ে যায় এবং শুধুমাত্র সংশ্লিষ্ট বিল্ড অ্যাকশন সফলভাবে সম্পন্ন হওয়ার পরে।

  • প্রতিটি ক্রিয়া একটি তাজা পাত্রে সঞ্চালিত হয়। প্রতিটি তৈরি করা বিল্ড অ্যাকশনের জন্য একটি নতুন, অনন্য ধারক তৈরি করা হয়েছে।

আপনি নিম্নলিখিত পদ্ধতিগুলির মধ্যে একটি ব্যবহার করে এই সমস্যাগুলি সমাধান করতে পারেন:

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

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

পূর্বশর্ত

আপনি সমস্যা সমাধান শুরু করার আগে, আপনি যদি ইতিমধ্যে এটি না করে থাকেন তবে নিম্নলিখিতগুলি করুন:

  • ডকার ইনস্টল করুন এবং এটি চালানোর জন্য প্রয়োজনীয় অনুমতিগুলি কনফিগার করুন।
  • Bazel 0.14.1 বা তার পরে ইনস্টল করুন। আগের সংস্করণগুলি ডকার স্যান্ডবক্স বৈশিষ্ট্য সমর্থন করে না।
  • এখানে বর্ণিত হিসাবে আপনার বিল্ডের WORKSPACE ফাইলে সর্বশেষ রিলিজ সংস্করণে পিন করা bazel-toolchains রেপো যোগ করুন।
  • বৈশিষ্ট্যটি সক্ষম করতে আপনার .bazelrc ফাইলে পতাকা যুক্ত করুন৷ আপনার Bazel প্রকল্পের রুট ডিরেক্টরিতে ফাইলটি তৈরি করুন যদি এটি বিদ্যমান না থাকে। নীচের পতাকাগুলি একটি রেফারেন্স নমুনা। অনুগ্রহ করে bazel-toolchains রেপোতে সর্বশেষ .bazelrc ফাইলটি দেখুন এবং কনফিগার docker-sandbox জন্য সেখানে নির্ধারিত পতাকার মান অনুলিপি করুন।
# Docker Sandbox Mode
build:docker-sandbox --host_javabase=<...>
build:docker-sandbox --javabase=<...>
build:docker-sandbox --crosstool_top=<...>
build:docker-sandbox --experimental_docker_image=<...>
build:docker-sandbox --spawn_strategy=docker --strategy=Javac=docker --genrule_strategy=docker
build:docker-sandbox --define=EXECUTOR=remote
build:docker-sandbox --experimental_docker_verbose
build:docker-sandbox --experimental_enable_docker_sandbox

যদি আপনার নিয়মের জন্য অতিরিক্ত সরঞ্জামের প্রয়োজন হয়, তাহলে নিম্নলিখিতগুলি করুন:

  1. একটি ডকারফাইল ব্যবহার করে টুল ইনস্টল করে এবং স্থানীয়ভাবে ইমেজ তৈরি করে একটি কাস্টম ডকার কন্টেইনার তৈরি করুন।

  2. আপনার কাস্টম কন্টেইনার ছবির নামের সাথে উপরের --experimental_docker_image পতাকার মান প্রতিস্থাপন করুন।

স্থানীয়ভাবে সমস্যা সমাধান

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

যাইহোক, এই পদ্ধতিতে, স্থানীয়ভাবে ইনস্টল করা টুল, বাইনারি, এবং ডেটা আপনার বিল্ডে প্রবেশ করতে পারে, বিশেষ করে যদি এটি কনফিগার-স্টাইল ওয়ার্কস্পেস নিয়ম ব্যবহার করে। এই ধরনের ফাঁস দূরবর্তী মৃত্যুদন্ডের সাথে সমস্যা সৃষ্টি করবে; তাদের সনাক্ত করতে, স্থানীয়ভাবে সমস্যা সমাধানের পাশাপাশি একটি ডকার কন্টেইনারে সমস্যা সমাধান করুন।

ধাপ 1: বিল্ড চালান

  1. Bazel কমান্ডে --config=docker-sandbox পতাকা যোগ করুন যা আপনার বিল্ডটি কার্যকর করে। উদাহরণ স্বরূপ:

    bazel --bazelrc=.bazelrc build --config=docker-sandbox target
    
  2. বিল্ডটি চালান এবং এটি সম্পূর্ণ হওয়ার জন্য অপেক্ষা করুন। ডকার স্যান্ডবক্স বৈশিষ্ট্যের কারণে বিল্ডটি স্বাভাবিকের চেয়ে চার গুণ ধীর গতিতে চলবে।

আপনি নিম্নলিখিত ত্রুটির সম্মুখীন হতে পারেন:

ERROR: 'docker' is an invalid value for docker spawn strategy.

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

ধাপ 2: সনাক্ত করা সমস্যাগুলি সমাধান করুন

নিম্নলিখিতগুলি সবচেয়ে সাধারণভাবে সম্মুখীন হওয়া সমস্যা এবং তাদের সমাধান।

  • Bazel runfiles ট্রি দ্বারা উল্লেখ করা একটি ফাইল, টুল, বাইনারি বা সংস্থান অনুপস্থিত। . নিশ্চিত করুন যে প্রভাবিত লক্ষ্যগুলির সমস্ত নির্ভরতা স্পষ্টভাবে ঘোষণা করা হয়েছে। আরও তথ্যের জন্য অন্তর্নিহিত নির্ভরতা পরিচালনা দেখুন।

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

  • একটি বাইনারি মৃত্যুদন্ড ব্যর্থ হয়. বিল্ড নিয়মগুলির মধ্যে একটি হল এক্সিকিউশন এনভায়রনমেন্ট (ডকার কন্টেইনার) এর সাথে বেমানান একটি বাইনারি উল্লেখ করা। আরও তথ্যের জন্য প্ল্যাটফর্ম-নির্ভর বাইনারি পরিচালনা দেখুন। আপনি যদি সমস্যার সমাধান করতে না পারেন, তাহলে সহায়তার জন্য bazel-discuss@google.com- এ যোগাযোগ করুন।

  • @local-jdk এর একটি ফাইল অনুপস্থিত বা ত্রুটি সৃষ্টি করছে। আপনার স্থানীয় মেশিনে জাভা বাইনারিগুলি এটির সাথে বেমানান হওয়ার সময় বিল্ডে লিক হচ্ছে। java_toolchain এর পরিবর্তে আপনার নিয়ম এবং লক্ষ্যে @local_jdk ব্যবহার করুন। আপনার আরও সাহায্যের প্রয়োজন হলে bazel-discuss@google.com-এ যোগাযোগ করুন।

  • অন্যান্য ত্রুটি. সাহায্যের জন্য bazel-discuss@google.com- এ যোগাযোগ করুন।

একটি ডকার পাত্রে সমস্যা সমাধান

এই পদ্ধতির সাহায্যে, ব্যাজেল একটি হোস্ট ডকার কন্টেইনারের ভিতরে চলে এবং ব্যাজেলের বিল্ড অ্যাকশনগুলি ডকার স্যান্ডবক্স বৈশিষ্ট্য দ্বারা উদ্ভূত পৃথক টুলচেন কন্টেইনারগুলির মধ্যে সঞ্চালিত হয়। স্যান্ডবক্স প্রতিটি বিল্ড অ্যাকশনের জন্য একটি একেবারে নতুন টুলচেন কন্টেইনার তৈরি করে এবং প্রতিটি টুলচেন কন্টেইনারে শুধুমাত্র একটি অ্যাকশন চালানো হয়।

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

ধাপ 1: ধারক তৈরি করুন

  1. একটি Dockerfile তৈরি করুন যা ডকার কন্টেইনার তৈরি করে এবং বিল্ড সরঞ্জামগুলির একটি ন্যূনতম সেট সহ বেজেল ইনস্টল করে:

    FROM debian:stretch
    
    RUN apt-get update && apt-get install -y apt-transport-https curl software-properties-common git gcc gnupg2 g++ openjdk-8-jdk-headless python-dev zip wget vim
    
    RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
    
    RUN add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
    
    RUN apt-get update && apt-get install -y docker-ce
    
    RUN wget https://releases.bazel.build/<latest Bazel version>/release/bazel-<latest Bazel version>-installer-linux-x86_64.sh -O ./bazel-installer.sh && chmod 755 ./bazel-installer.sh
    
    RUN ./bazel-installer.sh
    
  2. bazel_container হিসাবে ধারক তৈরি করুন:

    docker build -t bazel_container - < Dockerfile
    

ধাপ 2: ধারক শুরু করুন

নীচে দেখানো কমান্ড ব্যবহার করে ডকার কন্টেইনার শুরু করুন। কমান্ডে, আপনার হোস্টের সোর্স কোডের পথটি প্রতিস্থাপন করুন যা আপনি তৈরি করতে চান।

docker run -it \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /tmp:/tmp \
  -v your source code directory:/src \
  -w /src \
  bazel_container \
  /bin/bash

এই কমান্ডটি রুট হিসাবে কন্টেইনার চালায়, ডকার সকেট ম্যাপ করে এবং /tmp ডিরেক্টরি মাউন্ট করে। এটি ব্যাজেলকে অন্যান্য ডকার কন্টেইনার তৈরি করতে এবং সেই কন্টেইনারগুলির সাথে ফাইলগুলি ভাগ করতে /tmp এর অধীনে ডিরেক্টরিগুলি ব্যবহার করতে দেয়। আপনার সোর্স কোড কন্টেইনারের ভিতরে /src এ উপলব্ধ।

কমান্ডটি ইচ্ছাকৃতভাবে একটি debian:stretch বেস কন্টেইনার থেকে শুরু হয় যাতে টুলচেইন কন্টেইনার হিসাবে ব্যবহৃত rbe-ubuntu16-04 কন্টেইনারের সাথে বেমানান বাইনারি অন্তর্ভুক্ত থাকে। যদি স্থানীয় পরিবেশ থেকে বাইনারিগুলি টুলচেইন কন্টেইনারে লিক হয়, তবে তারা বিল্ড ত্রুটির কারণ হবে।

ধাপ 3: ধারক পরীক্ষা করুন

এটি পরীক্ষা করতে ডকার কন্টেইনারের ভিতর থেকে নিম্নলিখিত কমান্ডগুলি চালান:

docker ps
bazel version

ধাপ 4: বিল্ড চালান

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

bazel --output_user_root=/tmp/bazel_docker_root --bazelrc=.bazelrc \ build --config=docker-sandbox target

ধাপ 5: সনাক্ত করা সমস্যাগুলি সমাধান করুন

আপনি নিম্নলিখিত হিসাবে বিল্ড ব্যর্থতা সমাধান করতে পারেন: