Workspace के नियमों में नॉन-हार्मेटिक व्यवहार ढूंढना

इनमें से एक होस्ट मशीन, वह मशीन है जिस पर Bazel चलता है.

रिमोट तौर पर एक्ज़ीक्यूशन का इस्तेमाल करने पर, असल बिल्ड और/या टेस्ट चरण होस्ट मशीन पर नहीं होते, बल्कि उन्हें रिमोट एक्ज़ीक्यूशन सिस्टम पर भेज दिया जाता है. हालांकि, फ़ाइल फ़ोल्डर के नियमों को हल करने के चरण होस्ट मशीन पर हैं. अगर आपके फ़ाइल फ़ोल्डर के नियम, एक्ज़ीक्यूशन के दौरान इस्तेमाल करने के लिए होस्ट मशीन की जानकारी ऐक्सेस करते हैं, तो एनवायरमेंट के बीच होने वाली गड़बड़ियों की वजह से आपका बिल्ड टूट सकता है.

रिमोट एक्ज़ीक्यूशन के लिए Bazel के नियमों को अपनाना के हिस्से के तौर पर, आपको फ़ाइल फ़ोल्डर के ऐसे नियमों को ढूंढकर उन्हें ठीक करना होगा. इस पेज में बताया गया है कि फ़ाइल फ़ोल्डर के लॉग का इस्तेमाल करके, ऐसे फ़ाइल फ़ोल्डर के नियमों को कैसे ढूंढें जो समस्याएं हो सकते हैं.

नॉन-हर्मेटिक नियम ढूंढना

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

Bazel 0.18 से शुरू करते हुए, अपने Bazel कमांड में --experimental_workspace_rules_log_file=[PATH] फ़्लैग जोड़कर, कुछ संभावित नॉन-हर्मेटिक कार्रवाइयों का लॉग पाया जा सकता है. यहां [PATH] एक फ़ाइल नाम है, जिसके तहत लॉग बनाया जाएगा.

इन बातों का ध्यान रखें:

  • लॉग, इवेंट के एक्ज़ीक्यूट होते ही उन्हें कैप्चर कर लेता है. अगर कुछ चरण कैश मेमोरी में सेव किए गए हैं, तो वे लॉग में नहीं दिखेंगे. इसलिए, पूरा नतीजा पाने के लिए, bazel clean --expunge को पहले से चलाना न भूलें.

  • कभी-कभी फ़ंक्शन फिर से चलाए जा सकते हैं. ऐसे में, मिलते-जुलते इवेंट, लॉग में कई बार दिखेंगे.

  • फ़िलहाल, Workspace के नियमों में सिर्फ़ Starlark इवेंट लॉग किए जाते हैं.

यह देखने के लिए कि फ़ाइल फ़ोल्डर को शुरू करने के दौरान क्या चलाया गया था:

  1. bazel clean --expunge चलाएं. यह निर्देश आपके लोकल कैश और कैश मेमोरी में सेव किए गए डेटा स्टोर करने की जगहों को मिटा देगा, ताकि यह पक्का हो सके कि सभी प्रोसेस फिर से शुरू की जाएंगी.

  2. अपने Bazel कमांड में --experimental_workspace_rules_log_file=/tmp/workspacelog को जोड़ें और बिल्ड चलाएं.

    इससे एक बाइनरी प्रोटो फ़ाइल बनती है जिसमें WorkspaceEvent टाइप के मैसेज दिखते हैं

  3. Bazel सोर्स कोड डाउनलोड करें और नीचे दिए गए कमांड का इस्तेमाल करके, Bazel फ़ोल्डर पर जाएं. workspacelog पार्सर से वर्कस्पेस लॉग को पार्स करने के लिए, आपको सोर्स कोड की ज़रूरत होगी.

    git clone https://github.com/bazelbuild/bazel.git
    cd bazel
    
  4. Bazel सोर्स कोड रेपो में, पूरे फ़ाइल फ़ोल्डर लॉग को टेक्स्ट में बदलें.

    bazel build src/tools/workspacelog:parser
    bazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog > /tmp/workspacelog.txt
    
  5. आउटपुट काफ़ी ज़्यादा शब्दों में हो सकता है और इसमें Bazel के नियमों से मिला आउटपुट शामिल हो सकता है.

    आउटपुट से कुछ खास नियमों को बाहर रखने के लिए, --exclude_rule विकल्प का इस्तेमाल करें. उदाहरण के लिए:

    bazel build src/tools/workspacelog:parser
    bazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog \
        --exclude_rule "//external:local_config_cc" \
        --exclude_rule "//external:dep" > /tmp/workspacelog.txt
    
  6. /tmp/workspacelog.txt खोलें और असुरक्षित कार्रवाइयों की जांच करें.

इस लॉग में WorkspaceEvent के मैसेज होते हैं. इनमें repository_ctx पर की गई कुछ ऐसी कार्रवाइयां होती हैं जो हर्मेटिक के बिना ही होती हैं.

जिन कार्रवाइयों को 'हर्मेटिक न हो' के तौर पर हाइलाइट किया गया है वे इस तरह हैं:

  • execute: होस्ट एनवायरमेंट पर आर्बिट्रेरी निर्देश चलाता है. देखें कि क्या इनकी वजह से, होस्ट एनवायरमेंट पर कोई डिपेंडेंसी हो सकती है.

  • download, download_and_extract: हर्मेटिक बिल्ड पक्का करने के लिए, पक्का करें कि sha256 के बारे में बताया गया हो

  • file, template: यह अपने-आप में हर्मेटिक नहीं है, लेकिन इसे रिपॉज़िटरी में होस्ट एनवायरमेंट की डिपेंडेंसी लागू करने का तरीका हो सकता है. पक्का करें कि आपको पता है कि इनपुट कहां से आ रहा है. साथ ही, यह भी पक्का करें कि यह होस्ट एनवायरमेंट पर निर्भर न करता हो.

  • os: यह अपने-आप में हर्मेटिक नहीं है, बल्कि होस्ट एनवायरमेंट की डिपेंडेंसी पाने का एक आसान तरीका है. आम तौर पर, इस तरह की तकनीक को सेहत के लिहाज़ से ठीक माना जाता है. आपका इस्तेमाल हेर्मेटिक है या नहीं, इसका आकलन करने के लिए ध्यान में रखें कि यह होस्ट पर चल रहा है, न कि वर्कर पर. रिमोट बिल्ड के लिए आम तौर पर होस्ट से एनवायरमेंट की खास जानकारी हासिल करना अच्छा नहीं होता.

  • symlink: यह आम तौर पर सुरक्षित है, लेकिन लाल झंडों पर ध्यान दें. रिपॉज़िटरी के बाहर या किसी ऐब्सलूट पाथ के किसी सिमलिंक से रिमोट वर्कर पर समस्या होगी. अगर सिमलिंक को होस्ट मशीन की प्रॉपर्टी के आधार पर बनाया गया है, तो इससे भी शायद समस्या हो सकती है.

  • which: आम तौर पर, होस्ट पर इंस्टॉल किए गए प्रोग्राम की जांच करना मुश्किल होता है, क्योंकि कर्मचारियों के कॉन्फ़िगरेशन अलग-अलग हो सकते हैं.