การค้นหาพฤติกรรมที่ไม่สม่ำเสมอในกฎของ WORKSPACE

วันที่ รายงานปัญหา ดูแหล่งที่มา ตอนกลางคืน · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

ดังต่อไปนี้ เครื่องโฮสต์คือเครื่องที่ Bazel ทำงาน

เมื่อใช้การดำเนินการจากระยะไกล ขั้นตอนบิลด์และ/หรือการทดสอบจริงจะไม่ได้ เกิดขึ้นในเครื่องโฮสต์ แต่จะส่งไปยังการดำเนินการระยะไกลแทน ระบบ แต่ขณะนี้ยังมีขั้นตอนที่เกี่ยวข้องในการแก้ไขกฎพื้นที่ทำงานอยู่ ในเครื่องโฮสต์ หากกฎพื้นที่ทำงานเข้าถึงข้อมูลเกี่ยวกับ เครื่องโฮสต์เพื่อใช้ระหว่างการดำเนินการ บิลด์ของคุณมีแนวโน้มที่จะเสียหายเนื่องจาก ความไม่เข้ากันระหว่างสภาพแวดล้อม

ในฐานะส่วนหนึ่งของการปรับกฎของ Bazel สำหรับจากระยะไกล การดำเนินการ คุณจะต้องหากฎพื้นที่ทำงานดังกล่าว แล้วแก้ปัญหา หน้านี้อธิบายวิธีค้นหาพื้นที่ทำงานที่อาจเป็นปัญหา กฎที่ใช้บันทึกของพื้นที่ทำงาน

การค้นหากฎที่ไม่ขึ้นกับสัญชาตญาณ

กฎพื้นที่ทำงานช่วยให้นักพัฒนาซอฟต์แวร์เพิ่มทรัพยากร Dependency ได้ พื้นที่ทำงานภายนอก แต่ก็มีข้อมูลมากพอที่จะทำให้สามารถประมวลผล เกิดขึ้นในกระบวนการ คำสั่งที่เกี่ยวข้องทั้งหมดจะเกิดขึ้นภายในระบบและสามารถ แหล่งที่มาของความไม่เป็นธรรมชาติ ปกติแล้วเป็นลักษณะการทำงานที่ไม่ได้เป็นแบบปรนัย เปิดตัวผ่าน repository_ctx ซึ่งช่วยให้โต้ตอบได้ ด้วยเครื่องโฮสต์

เริ่มตั้งแต่ Bazel 0.18 เป็นต้นไป คุณสามารถรับบันทึก โดยเพิ่มแฟล็ก --experimental_workspace_rules_log_file=[PATH] ลงใน คำสั่ง Bazel นี่คือ [PATH] เป็นชื่อไฟล์ที่จะเก็บบันทึก สร้าง แล้ว

สิ่งที่ควรทราบ

  • บันทึกจะบันทึกเหตุการณ์เมื่อมีการเรียกใช้ หากบางขั้นตอน แคชจะไม่แสดงในบันทึก ดังนั้นเพื่อให้ได้ผลลัพธ์ทั้งหมด โปรดอย่า ลืมเรียกใช้ bazel clean --expunge ล่วงหน้า

  • บางครั้งฟังก์ชันอาจมีการดำเนินการใหม่ ซึ่งในกรณีนี้ กิจกรรมจะปรากฏขึ้นในบันทึกหลายครั้ง

  • ขณะนี้กฎ Workspace บันทึกเฉพาะเหตุการณ์ Starlark เท่านั้น

หากต้องการค้นหาสิ่งที่ดำเนินการในระหว่างการเริ่มต้นพื้นที่ทำงาน ให้ทำดังนี้

  1. เรียกใช้ bazel clean --expunge คำสั่งนี้จะล้างแคชในเครื่องและ ที่เก็บที่แคชไว้ทั้งหมด เพื่อให้มั่นใจว่าการเริ่มต้นทั้งหมดจะทำงานอีกครั้ง

  2. เพิ่ม --experimental_workspace_rules_log_file=/tmp/workspacelog ไปที่ ใช้คำสั่ง Bazel และเรียกใช้บิลด์

    การดำเนินการนี้จะสร้างไฟล์ไบนารี Proto ซึ่งแสดงข้อความประเภท WorkspaceEvent

  3. ดาวน์โหลดซอร์สโค้ด Bazel และไปยังโฟลเดอร์ Bazel โดยใช้ คำสั่งด้านล่าง คุณต้องมีซอร์สโค้ดเพื่อให้สามารถแยกวิเคราะห์ ในบันทึก Workspace ที่มี โปรแกรมแยกวิเคราะห์ 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: ปัจจัยนี้ไม่ใช่ปัจจัยที่ต่างกันในตัวเอง แต่อาจเป็นกลไกการทำงาน สำหรับการนำทรัพยากร Dependency ในสภาพแวดล้อมโฮสต์ไปยังที่เก็บ คุณต้องเข้าใจว่าข้อมูลนั้นๆ มาจากไหนและไม่ได้ใช้ ขึ้นอยู่กับสภาพแวดล้อมของโฮสต์

  • os: วิธีนี้ไม่ได้มีความสำคัญในตัว แต่เป็นวิธีง่ายๆ ในการรับทรัพยากร Dependency ในสภาพแวดล้อมของโฮสต์ โดยทั่วไปงานสร้างที่แยกต่างหากจะไม่เรียกว่าสิ่งนี้ ในการประเมินว่าการใช้งานของคุณเป็นแบบครอบคลุมหรือไม่ ให้คำนึงอยู่เสมอว่า ทำงานบนโฮสต์ ไม่ใช่คนทำงาน การรับข้อมูลจำเพาะของสภาพแวดล้อม จากโฮสต์มักจะไม่ใช่แนวคิดที่ดีสำหรับบิลด์ระยะไกล

  • symlink: โดยทั่วไปแล้วปลอดภัย แต่มองหาสัญญาณสีแดง ลิงก์สัญลักษณ์ไปยัง ภายนอกที่เก็บหรือไปยังเส้นทางสัมบูรณ์อาจทำให้เกิดปัญหาเกี่ยวกับ ซึ่งเป็นผู้ที่ทำงานทางไกลได้ หากสร้างลิงก์สัญลักษณ์โดยอิงตามพร็อพเพอร์ตี้เครื่องโฮสต์ ก็อาจเป็นปัญหาได้เช่นกัน

  • which: การตรวจหาโปรแกรมที่ติดตั้งในโฮสต์มักจะเป็นปัญหา เนื่องจากคนทำงาน อาจมีการกำหนดค่าต่างกัน