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

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

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

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

การค้นหากฎที่ไม่ใช่แบบปิด

กฎของ Workspace อนุญาตให้นักพัฒนาซอฟต์แวร์เพิ่มการอ้างอิงไปยัง พื้นที่ทำงานภายนอกได้ แต่ก็มีรายละเอียดมากพอที่จะอนุญาตให้มีการประมวลผลที่กำหนดเอง เกิดขึ้นในกระบวนการได้ คำสั่งที่เกี่ยวข้องทั้งหมดจะเกิดขึ้นในเครื่องและอาจเป็น แหล่งที่มาที่อาจทำให้เกิดการไม่ปิดสนิท โดยปกติแล้วลักษณะการทำงานที่ไม่ใช่แบบปิดจะ เกิดขึ้นผ่าน 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 ด้วย เครื่องมือแยกวิเคราะห์บันทึก Workspace ได้

    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 ที่ระบุการดำเนินการบางอย่างที่อาจไม่เป็นไปตามข้อกำหนดของ Hermeticity ซึ่งดำเนินการใน repository_ctx

การดำเนินการที่ไฮไลต์ว่าอาจไม่เป็นแบบเฮอร์มีติกมีดังนี้

  • execute: เรียกใช้คำสั่งใดก็ได้ในสภาพแวดล้อมโฮสต์ ตรวจสอบว่า รายการเหล่านี้อาจทำให้เกิดการอ้างอิงในสภาพแวดล้อมโฮสต์หรือไม่

  • download, download_and_extract: ตรวจสอบว่าได้ระบุ sha256 เพื่อให้มั่นใจว่าบิลด์เป็นแบบปิด

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

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

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

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