स्थानीय निर्माणों को प्रभावित न करने वाले प्रतिबंधों और आवश्यकताओं के कारण बेजल बिल्ड स्थानीय रूप से सफल होते हैं हो सकते हैं. इस तरह की गड़बड़ियों की सबसे आम वजहों के बारे में यहां बताया गया है. इनमें, जगह के हिसाब से एक्ज़ीक्यूशन के लिए, बैजल के नियमों को अपनाने से जुड़ी जानकारी शामिल है.
इस पेज पर, ऐसे सबसे सामान्य मुद्दों की पहचान करने और उन्हें हल करने के तरीके के बारे में बताया गया है जो डॉकर सैंडबॉक्स की सुविधा का इस्तेमाल करके, रिमोट तरीके से एक्ज़ीक्यूशन करने पर आती हैं. इस सैंडबॉक्स सुविधा में, एक्ज़ीक्यूशन के लिए रिमोट ऐक्सेस वाले कॉन्फ़िगरेशन के बराबर पाबंदियां लगाई जाती हैं. इससे आपको अपने बिल्ड को हल करने के लिए, रिमोट एक्ज़ीक्यूशन सेवा की ज़रूरत नहीं होगी.
डॉकर सैंडबॉक्स की सुविधा, रिमोट एक्ज़ीक्यूशन से जुड़ी पाबंदियों की नकल करती है. इसकी जानकारी यहां दी गई है:
टूलचेन कंटेनर में बिल्ड कार्रवाइयां लागू होती हैं. अपने कंटेनर को स्थानीय और किसी दूसरी जगह से इस्तेमाल करने के लिए, उसी कंटेनर का इस्तेमाल करें. इसके लिए, कंटेनर की मदद से बनाए गए रिमोट का इस्तेमाल करने वाली सेवा का इस्तेमाल किया जा सकता है.
ऐसा कोई भी डेटा नहीं है जो कंटेनर की सीमा को पार करता हो. कंटेनर में सर्च इंजन का इस्तेमाल करने पर, सिर्फ़ साफ़ तौर पर बताए गए इनपुट और आउटपुट ही डाले और हटाए जाते हैं. ये बदलाव, कॉन्टेंट बनाने से जुड़ी कार्रवाई के पूरा होने के बाद ही किए जाते हैं.
हर कार्रवाई एक नए कंटेनर में होती है. हर जुड़े हुए बिल्ड ऐक्शन के लिए, एक नया और खास कंटेनर बनाया जाता है.
इनमें से किसी एक तरीके का इस्तेमाल करके, इन समस्याओं को हल किया जा सकता है:
नेटिव तरीके से समस्या हल करना. इस तरीके से, Bazel और उसकी बिल्ड कार्रवाइयां आपकी लोकल मशीन पर काम करती हैं. डॉकर सैंडबॉक्स की सुविधा, एक जगह से दूसरी जगह एक्ज़ीक्यूशन के बराबर बनाने पर पाबंदी लगाती है. हालांकि, इस तरीके से आपके बिल्ड में स्थानीय टूल, स्थितियों, और डेटा लीक होने का पता नहीं चलेगा. इस वजह से रिमोट प्रोग्राम चलाने में समस्या आ सकती है.
डॉकर कंटेनर में मौजूद समस्या को हल करना. इस तरीके से, Bazel और उसकी बिल्ड कार्रवाइयां एक डॉकर कंटेनर के अंदर चलती हैं, जिससे आप स्थानीय मशीन से बिल्ड में टूल, स्थितियों, और डेटा लीक का पता लगा सकते हैं. साथ ही, इस पर लगने वाली पाबंदियों को दूर से लागू करने पर भी पाबंदियां लागू होती हैं. यह तरीका आपके बिल्ड के बारे में अहम जानकारी देता है, भले ही बिल्ड के कुछ हिस्से काम न कर रहे हों. यह तरीका प्रयोग के लिए है और आधिकारिक तौर पर इसका इस्तेमाल नहीं किया जा सकता.
ज़रूरी शर्तें
अगर आपने समस्या को हल करने की शुरुआत नहीं की है, तो सबसे पहले ये काम करें:
- डॉकर इंस्टॉल करें और उसे चलाने के लिए ज़रूरी अनुमतियां कॉन्फ़िगर करें.
- Bazel 0.14.1 या इसके बाद के वर्शन को इंस्टॉल करें. इससे पहले के वर्शन में, डॉकर सैंडबॉक्स की सुविधा काम नहीं करती.
- यहां दी गई जानकारी के मुताबिक, अपने बिल्ड की
WORKSPACE
फ़ाइल में, bazel-toolchains रेपो को जोड़ें, जिसे सबसे नए रिलीज़ वर्शन पर पिन किया गया है. - इस सुविधा को चालू करने के लिए, अपनी
.bazelrc
फ़ाइल में फ़्लैग जोड़ें. अगर आपका बेज़ल प्रोजेक्ट मौजूद नहीं है, तो उसकी रूट डायरेक्ट्री में फ़ाइल बनाएं. नीचे दिए गए फ़्लैग, पहचान के लिए दिए गए सैंपल हैं. कृपया bazel-toolchains repo में नया.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
में चलने के लिए कॉन्फ़िगर किए गए हैं.
अगर आपके नियमों के लिए और टूल चाहिए, तो ये काम करें:
Dockerfile का इस्तेमाल करके, टूल इंस्टॉल करके अपनी पसंद के मुताबिक डॉकर कंटेनर बनाएं. इस इमेज को स्थानीय तौर पर बनाएं.
ऊपर दी गई
--experimental_docker_image
फ़्लैग की वैल्यू को अपनी कस्टम कंटेनर इमेज के नाम से बदलें.
नेटिव समस्या हल करना
यह तरीका Bazel और उसकी सभी बिल्ड कार्रवाइयों को सीधे लोकल मशीन पर लागू करता है. साथ ही, यह एक भरोसेमंद तरीका है, जिससे यह पक्का किया जा सकता है कि आपका बिल्ड रिमोट तरीके से चल रहा है या नहीं.
हालांकि, इस तरीके से स्थानीय रूप से इंस्टॉल किए गए टूल, बाइनरी, और डेटा आपके बिल्ड में लीक हो सकते हैं. खास तौर पर तब, जब इसमें config-style WORKSPACE के नियम इस्तेमाल किए गए हों. ऐसे लीक की वजह से, रिमोट तरीके से एक्ज़ीक्यूट करने में समस्या आती है. इन गड़बड़ियों का पता लगाने के लिए, डॉकर कंटेनर में समस्या हल करें. साथ ही, नेटिव समस्या हल करने के तरीके के बारे में जानें.
पहला चरण: बिल्ड चलाएं
--config=docker-sandbox
फ़्लैग को उस बेज़ल कमांड में जोड़ें जो आपका बिल्ड लागू करता है. उदाहरण के लिए :bazel --bazelrc=.bazelrc build --config=docker-sandbox target
बिल्ड चलाएं और इसके पूरा होने का इंतज़ार करें. डॉकर सैंडबॉक्स सुविधा की वजह से यह बिल्ड सामान्य से चार गुना धीमा चलेगा.
आपको यह गड़बड़ी दिख सकती है:
ERROR: 'docker' is an invalid value for docker spawn strategy.
अगर ऐसा है, तो --experimental_docker_verbose
फ़्लैग के साथ बिल्ड को फिर से चलाएं.
इस फ़्लैग के आगे गड़बड़ी के मैसेज दिखते हैं. आम तौर पर, यह गड़बड़ी ठीक से काम न करने वाले डॉकर की वजह से होती है. इसके अलावा, हो सकता है कि मौजूदा उपयोगकर्ता खाते के तहत उसे मंज़ूरी न मिल पाए. ज़्यादा जानकारी के लिए
Docker दस्तावेज़ देखें. अगर समस्याएं बनी रहती हैं, तो सीधे डॉक कंटेनर में समस्या हल करना पर जाएं.
दूसरा चरण: पता लगाई गई समस्याएं ठीक करना
यहां आम तौर पर आने वाली समस्याएं और उनके हल दिए गए हैं.
किसी फ़ाइल, टूल, बाइनरी या रिसॉर्स के बारे में Bazel Runfiles ट्री में बताया गया है, जो मौजूद नहीं है.. पुष्टि करें कि जिन टारगेट पर असर पड़ा है उनकी सभी डिपेंडेंसी साफ़ तौर पर बताई गई हैं. ज़्यादा जानकारी के लिए, इंप्लिसिट डिपेंडेंसी मैनेज करना देखें.
किसी सटीक पाथ या
PATH
वैरिएबल से जुड़ी फ़ाइल, टूल, बाइनरी या रिसॉर्स मौजूद नहीं है. पुष्टि करें कि सभी ज़रूरी टूल टूलचेन कंटेनर में इंस्टॉल किए गए हैं. साथ ही, टूलचेन नियमों का इस्तेमाल करके, उस डिपेंडेंसी का सही तरीके से एलान करें जो मौजूद नहीं है. ज़्यादा जानकारी के लिए, टूलचेन नियमों के ज़रिए बिल्ड टूल का इस्तेमाल करना देखें.बाइनरी नहीं चल रही है. बिल्ड के एक नियम में एक बाइनरी फ़ाइल शामिल है, जो एक्ज़ीक्यूशन एनवायरमेंट (डॉक कंटेनर) के साथ काम नहीं करती. ज़्यादा जानकारी के लिए, प्लैटफ़ॉर्म के हिसाब से बाइनरी मैनेज करना देखें. अगर समस्या हल नहीं हो पा रही है, तो मदद के लिए bazel-consent@google.com से संपर्क करें.
@local-jdk
की किसी फ़ाइल में कोई गड़बड़ी है या इससे गड़बड़ियां हो रही हैं. आपकी लोकल मशीन की Java बाइनरी, बिल्ड में लीक हो रही हैं, जबकि यह उसके साथ काम नहीं करती है. अपने नियमों और टारगेट में,@local_jdk
के बजायjava_toolchain
का इस्तेमाल करें. अगर आपको कोई और मदद चाहिए, तो bazel-consent@google.com से संपर्क करें.अन्य गड़बड़ियां. मदद के लिए, bazel-consent@google.com से संपर्क करें.
डॉकर कंटेनर से जुड़ी समस्या हल करना
इस तरीके से, बेज़ल एक होस्ट डॉकर कंटेनर के अंदर चलता है और Bazel की बिल्ड कार्रवाइयां, डॉकर सैंडबॉक्स सुविधा से बने अलग-अलग टूलचेन कंटेनर में काम करती हैं. सैंडबॉक्स हर बिल्ड कार्रवाई के लिए एक नया टूलचेन कंटेनर पैदा करता है और हर टूलचेन कंटेनर में केवल एक ही कार्रवाई निष्पादित करता है.
इस तरीके से, होस्ट एनवायरमेंट में इंस्टॉल किए गए टूल का ज़्यादा कंट्रोल मिलता है. बिल्ड के एक्ज़ीक्यूशन को उसकी बिल्ड कार्रवाइयों के एक्ज़ीक्यूशन से और इंस्टॉल किए गए टूल को कम से कम रखने से, यह पुष्टि की जा सकती है कि आपका बिल्ड, एक्ज़ीक्यूशन के लोकल एनवायरमेंट पर निर्भर करता है या नहीं.
पहला चरण: कंटेनर बनाना
ऐसा
Dockerfile
बनाएं जो डॉकर कंटेनर बनाता हो और कम से कम बिल्ड टूल के साथ Bazel इंस्टॉल करता हो: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
कंटेनर को
bazel_container
के तौर पर बनाएं:docker build -t bazel_container - < Dockerfile
दूसरा चरण: कंटेनर को शुरू करना
नीचे दिखाए गए निर्देश का इस्तेमाल करके, डॉकर कंटेनर शुरू करें. निर्देश में, अपने होस्ट पर उस सोर्स कोड का पाथ डालें जिसे आपको बनाना है.
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
कंटेनर के साथ काम नहीं करतीं. अगर स्थानीय परिवेश की बाइनरी टूलचेन कंटेनर में लीक हो रही हैं, तो इनकी वजह से बिल्ड गड़बड़ियां होंगी.
तीसरा चरण: कंटेनर की जांच करना
डॉकर कंटेनर की जांच करने के लिए, उसमें दिए गए कमांड चलाएं:
docker ps
bazel version
चरण 4: बिल्ड चलाएं
बिल्ड को नीचे दिखाए गए तरीके से चलाएं. आउटपुट उपयोगकर्ता रूट होता है, ताकि वह उस डायरेक्ट्री से मेल खाए, जिस पर होस्ट कंटेनर में कंटेनर के अंदर से उसी पाथ से ऐक्सेस किया जा सके. इसमें डॉकर सैंडबॉक्स की सुविधा से बने टूलचेन कंटेनर होते हैं. इन सुविधाओं में बेज़ल की बिल्ड कार्रवाइयां चल रही होती हैं. साथ ही, होस्ट और कार्रवाई कंटेनर वाली लोकल मशीन से भी इसे ऐक्सेस किया जा सकता है.
bazel --output_user_root=/tmp/bazel_docker_root --bazelrc=.bazelrc \ build --config=docker-sandbox target
पांचवां चरण: पता लगाई गई समस्याएं ठीक करना
इन तरीकों से बिल्ड फ़ेल होने को ठीक किया जा सकता है:
अगर बिल्ड "डिस्क में नहीं है" गड़बड़ी के साथ काम नहीं करता है, तो आप होस्ट कंटेनर को
--memory=XX
फ़्लैग के साथ शुरू करके इस सीमा को बढ़ा सकते हैं.XX
में गीगाबाइट (जीबी) में आवंटित डिस्क स्पेस होता है. यह प्रक्रिया प्रयोग के तौर पर है और इसकी वजह से अचानक कोई भी बदलाव हो सकता है.अगर विश्लेषण या लोड होने के चरणों के दौरान बिल्ड पूरा नहीं हो पाता है, तो WorkSPACE फ़ाइल में बताए गए आपके एक या उससे ज़्यादा नियम, रिमोट एक्ज़ीक्यूशन के साथ काम नहीं करते. संभावित वजहों और दूसरे तरीकों के लिए, दूर से लागू करने के लिए Bazel के नियमों को अपनाने पर जाएं.
अगर बिल्ड किसी और वजह से काम नहीं करता, तो दूसरा कदम: पता लगाई गई समस्याओं को ठीक करें में दिए गए समस्या हल करने के तरीके देखें.