Docker सैंडबॉक्स की मदद से, Bazel रिमोट एक्ज़ीक्यूशन की समस्या हल करना

अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है किसी समस्या की शिकायत करें सोर्स देखें रात · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Basel के ऐसे बिल्ड जो स्थानीय तौर पर सफल होते हैं, अगर उन्हें रिमोट तरीके से एक्ज़ीक्यूट नहीं किया जाता है, तो ऐसा हो सकता है: ऐसी पाबंदियां और ज़रूरी शर्तें हैं जिनका असर लोकल बिल्ड पर कोई असर नहीं पड़ता. सबसे ज़्यादा खाया गया खाना इस तरह की गड़बड़ी की वजहों के बारे में, रिमोट एक्ज़िक्यूशन के लिए बेज़ल रूल को अपनाना में बताया गया है.

इस पेज में, सबसे आम समस्याओं की पहचान करने और उन्हें हल करने का तरीका बताया गया है Docker सैंडबॉक्स सुविधा का इस्तेमाल करके, रिमोट तौर पर एक्ज़ीक्यूट किया जा सकता है. उन पर पाबंदियां लगाई जा सकती हैं जो रिमोट तरीके से एक्ज़ीक्यूट करने की सुविधा के बराबर हैं. इससे आपको का इस्तेमाल करें. इसके लिए, आपको रिमोट एक्ज़ीक्यूशन सेवा की ज़रूरत नहीं होगी.

Docker सैंडबॉक्स सुविधा, रिमोट तौर पर एक्ज़ीक्यूट करने की पाबंदियों की तरह अनुसरण करता है:

  • टूलचेन कंटेनर में बनाई गई कार्रवाइयां एक्ज़ीक्यूट करें. आप भी इनका इस्तेमाल कर सकते हैं आपके बिल्ड को स्थानीय और कहीं से भी किसी सेवा के ज़रिए चलाने के लिए टूलचेन कंटेनर में कंटेनर को रिमोट तौर पर एक्ज़ीक्यूट करने की सुविधा मिलती है.

  • कोई भी बाहरी डेटा कंटेनर की सीमा को पार नहीं करता. सिर्फ़ साफ़ तौर पर बताया गया है तय किए गए इनपुट और आउटपुट, कंटेनर में जाएंगे और उससे बाहर निकलेंगे. साथ ही, बिल्ड ऐक्शन पूरा होता है.

  • हर कार्रवाई एक नए कंटेनर में पूरी होती है. एक नया और खास कंटेनर है हर जनरेट किए गए बिल्ड ऐक्शन के लिए बनाया गया.

इन समस्याओं को हल करने के लिए, इनमें से किसी एक तरीके का इस्तेमाल किया जा सकता है:

  • मूल रूप से समस्या हल करना. इस तरीके से, Basel और इसके बिल्ड ऐक्शन, आपकी लोकल मशीन पर नेटिव तौर पर चलते हैं. द डॉकर सैंडबॉक्स सुविधा, रिमोट के बराबर के बिल्ड पर पाबंदियां लगाती है निष्पादन. हालांकि, इस तरीके से लोकल टूल, राज्यों, और आपके बिल्ड में डेटा लीक हो रहा है. इसकी वजह से, आपको रिमोट तौर पर एक्ज़ीक्यूशन करने में समस्या आ सकती है.

  • Docker कंटेनर में समस्या हल करना. इस तरीके का इस्तेमाल करने पर, Basel और इसकी बिल्ड ऐक्शन, Docker कंटेनर के अंदर चलते हैं, इसकी मदद से, उपयोगकर्ताओं को उन टूल, राज्यों, और डेटा लीक होने का पता लगाया जा सकता है नई चीज़ें बनाने के साथ-साथ, रिमोट एक्ज़ीक्यूशन के बराबर होती हैं. यह तरीका आपकी बिल्ड में तब भी बदलाव किया जा सकता है, जब बिल्ड के काम न कर रहे हों. इस तरीके को अभी आज़माया जा रहा है और आधिकारिक तौर पर समर्थित नहीं है.

ज़रूरी शर्तें

अगर आपने अब तक ऐसा नहीं किया है, तो समस्या हल करने से पहले ये काम करें:

  • Docker इंस्टॉल करें और इसे चलाने के लिए ज़रूरी अनुमतियां कॉन्फ़िगर करें.
  • Basel 0.14.1 या बाद का वर्शन इंस्टॉल करें. पिछले वर्शन में Docker काम नहीं करता सैंडबॉक्स की सुविधा है.
  • baज़ल-toolchain जोड़ें रेपो, आपकी बिल्ड की WORKSPACE फ़ाइल में सबसे नए रिलीज़ वर्शन में पिन किया गया जैसा कि यहां बताया गया है.
  • इस सुविधा को चालू करने के लिए, अपनी .bazelrc फ़ाइल में फ़्लैग जोड़ें. इसमें फ़ाइल बनाएं कॉपी करें. फ़्लैग नीचे दिए गए हैं एक संदर्भ नमूना है. कृपया नई जानकारी देखें .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. Dockerfile का इस्तेमाल करके टूल इंस्टॉल करके, पसंद के मुताबिक Docker कंटेनर बनाएं और बिल्डिंग स्थानीय रूप से.

  2. ऊपर दिए गए --experimental_docker_image फ़्लैग के मान को आपके कस्टम कंटेनर की इमेज का नाम.

मूल रूप से समस्या हल करना

यह तरीका Basel और इसकी सभी बिल्ड ऐक्शन को सीधे लोकल साइट पर एक्ज़ीक्यूट करता है मशीन से होता है और यह पुष्टि करने का एक भरोसेमंद तरीका है कि आपका बिल्ड रिमोट तरीके से चलाया जा सकता है.

हालांकि, इस तरीके से, डिवाइस में इंस्टॉल किए गए टूल, बाइनरी, और डेटा लीक हो सकता है में बनाए रखें, खासकर अगर यह कॉन्फ़िगर-स्टाइल वर्कस्पेस नियमों का इस्तेमाल करता है. इस तरह के लीक होने से, रिमोट तरीके से काम करने में समस्याएं होंगी; इनका पता लगाने के लिए, Docker कंटेनर में समस्या हल करें वह इन समस्याओं को हल करने में आपकी मदद करता है.

चरण 1: बिल्ड चलाएं

  1. लागू करने वाले Basel कमांड में --config=docker-sandbox फ़्लैग जोड़ें आपका बिल्ड. उदाहरण के लिए:

    bazel --bazelrc=.bazelrc build --config=docker-sandbox target
    
  2. बिल्ड को चलाएं और इसके पूरा होने का इंतज़ार करें. बिल्ड ज़्यादा से ज़्यादा चार सेकंड तक चलेगा Docker सैंडबॉक्स सुविधा की वजह से, सामान्य से कई गुना धीमा है.

आपको इस गड़बड़ी का सामना करना पड़ सकता है:

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

अगर ऐसा किया जाता है, तो --experimental_docker_verbose फ़्लैग की मदद से बिल्ड को फिर से चलाएं. इस फ़्लैग से वर्बोस गड़बड़ी मैसेज चालू होते हैं. यह गड़बड़ी आम तौर पर, गलत Docker इंस्टॉलेशन या इसे चलाने के लिए अनुमतियों की कमी वाला हो. Docker के दस्तावेज़ देखें हमारा वीडियो देखें. अगर समस्याएं बनी रहती हैं, तो सीधे Docker कंटेनर में समस्या का हल पर जाएं.

दूसरा चरण: पहचानी गई समस्याओं को ठीक करना

आम तौर पर होने वाली सबसे ज़्यादा समस्याएं नीचे दी गई हैं. साथ ही, उन्हें ठीक करने के तरीके भी बताए गए हैं.

  • Baज़ल रनफ़ाइल ट्री से रेफ़र की गई फ़ाइल, टूल, बाइनरी या संसाधन मौजूद नहीं है.. पुष्टि करें कि जिन टारगेट पर असर पड़ा है उनकी सभी डिपेंडेंसी साफ़ तौर पर एलान किया गया हो. यहां जाएं: इंप्लिसिट डिपेंडेंसी मैनेज करना हमारा वीडियो देखें.

  • ऐब्सलूट पाथ या PATH से पहचानी जाने वाली फ़ाइल, टूल, बाइनरी या संसाधन वैरिएबल मौजूद नहीं है. पुष्टि करें कि सभी ज़रूरी टूल को टूलचेन कंटेनर और टूलचेन नियमों का इस्तेमाल करके, सही तरीके से उस डिपेंडेंसी के बारे में बताएं जो उपलब्ध संसाधन के बारे में बताती है. यहां जाएं: टूलचेन के नियमों की मदद से, बिल्ड टूल इस्तेमाल करना हमारा वीडियो देखें.

  • बाइनरी कोड लागू नहीं हो पाता है. बिल्ड का कोई एक नियम, बाइनरी का रेफ़रंस दे रहा है एक्ज़ीक्यूशन एनवायरमेंट (Docker कंटेनर) के साथ काम नहीं करता है. यहां जाएं: प्लैटफ़ॉर्म पर निर्भर बाइनरी फ़ाइलें मैनेज करना हमारा वीडियो देखें. अगर आप समस्या को ठीक नहीं कर पाते हैं, तो bazel-discuss@google.com से संपर्क करें सहायता के लिए.

  • @local-jdk की एक फ़ाइल मौजूद नहीं है या उसकी वजह से गड़बड़ियां हो रही हैं. Java बाइनरी आपकी लोकल मशीन पर बिल्ड में लीक हो रहे हैं, जबकि वे इसके साथ काम नहीं करते हैं इसे. java_toolchain का इस्तेमाल करें के बजाय अपने नियमों और लक्ष्यों में @local_jdk की जगह जोड़ दें. अगर आपको और सहायता चाहिए, तो bazel-discuss@google.com से संपर्क करें.

  • अन्य गड़बड़ियां. सहायता के लिए, bazel-discuss@google.com पर संपर्क करें.

Docker कंटेनर में समस्या हल करना

इस तरीके का इस्तेमाल करने पर, Baज़र, होस्ट Docker कंटेनर के अंदर चलता है और Baज़र, Docker से पैदा हुए अलग-अलग टूलचेन कंटेनर में की जाने वाली कार्रवाइयां सैंडबॉक्स की सुविधा है. सैंडबॉक्स से एक नया टूलचेन कंटेनर तैयार होता है, जिसमें हर बिल्ड ऐक्शन बनाने के साथ-साथ, हर टूलचेन कंटेनर में सिर्फ़ एक ऐक्शन लागू होता है.

इस तरीके से, होस्ट में इंस्टॉल किए गए टूल पर ज़्यादा कंट्रोल मिलता है पर्यावरण को ध्यान में रखते हुए काम करना. बिल्ड के एक्ज़ीक्यूशन को इसके एक्ज़ीक्यूशन से अलग करके, इसके बनाने और इंस्टॉल किए गए टूल को कम से कम रखने से पहले, आपके बिल्ड की लोकल एक्ज़ीक्यूशन एनवायरमेंट पर कोई डिपेंडेंसी है या नहीं.

पहला चरण: कंटेनर बनाना

  1. एक Dockerfile बनाएं, जो Docker कंटेनर बनाता है और Basel को इंस्टॉल करता है जिनमें बिल्ड टूल का कम से कम सेट मौजूद होता है:

    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
    

दूसरा चरण: कंटेनर शुरू करना

नीचे दिए गए निर्देश का इस्तेमाल करके, Docker कंटेनर शुरू करें. निर्देश में, को अपने होस्ट पर उस सोर्स कोड का पाथ दें जिसे आपको बनाना है.

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 डायरेक्ट्री. इसकी मदद से बेज़ल अन्य Docker कंटेनर को बड़ा कर पाते हैं और इन कंटेनर के साथ फ़ाइलें शेयर करने के लिए, /tmp में दी गई डायरेक्ट्री का इस्तेमाल करें. आपका सोर्स कंटेनर के अंदर /src पर कोड उपलब्ध है.

निर्देश, जान-बूझकर ऐसे debian:stretch बेस कंटेनर से शुरू होता है जो इसमें rbe-ubuntu16-04 कंटेनर के साथ असंगत बाइनरी शामिल हैं टूलचेन कंटेनर. अगर स्थानीय वातावरण से बाइनरी टूलचेन कंटेनर है, तो उसकी वजह से बिल्ड में गड़बड़ियां होंगी.

तीसरा चरण: कंटेनर को टेस्ट करना

Docker कंटेनर के अंदर से इसकी जांच करने के लिए, यहां दिए गए कमांड चलाएं:

docker ps
bazel version

चौथा चरण: बिल्ड चलाना

नीचे बताए गए तरीके से बिल्ड चलाएं. आउटपुट उपयोगकर्ता रूट होता है, ताकि वह एक ऐसी डायरेक्ट्री जिसे होस्ट के अंदर से उसी ऐब्सलूट पाथ से ऐक्सेस किया जा सकता है कंटेनर जिसमें बेज़ेल चलता है. यह डॉकर से पैदा हुए टूलचेन कंटेनर से लिया गया है एक सैंडबॉक्स सुविधा के साथ वह मशीन जिस पर होस्ट और ऐक्शन कंटेनर चलते हैं.

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

पांचवां चरण: पहचानी गई समस्याओं को ठीक करना

बिल्ड फ़ेल होने की समस्या को इस तरह ठीक किया जा सकता है:

  • अगर बिल्ड "डिस्क में स्टोरेज खत्म हो गया है" होने की वजह से काम नहीं करता है गड़बड़ी हुई है, तो इसे बढ़ाया जा सकता है --memory=XX फ़्लैग के साथ होस्ट कंटेनर शुरू करके सीमा तय करें, जहां XX गीगाबाइट में तय किया गया डिस्क स्टोरेज है. इस सुविधा को एक्सपेरिमेंट के तौर पर शुरू किया गया है और यह हो सकता है की वजह से मुश्किल व्यवहार हो सकता है.

  • अगर जांच करने या लोड होने के चरणों के दौरान बिल्ड काम नहीं करता, तो इनमें से एक या एक से ज़्यादा वर्कस्पेस फ़ाइल में बताए गए बिल्ड रूल के साथ काम नहीं करता है रिमोट तरीके से एक्ज़ीक्यूट किया जा सकता है. रिमोट तरीके से एक्ज़ीक्यूट करने के लिए बेज़ल नियमों को अपनाना देखें और समाधान के बारे में जानकारी पाएं.

  • अगर बिल्ड किसी अन्य वजह से पूरा नहीं हो पाता है, तो दूसरा चरण: पता लगाई गई समस्याओं को ठीक करना में दिए गए समस्या हल करने के तरीके देखें.