การค้นหาพฤติกรรมที่ไม่สมเหตุสมผลในกฎ WORKSPACE

รายงานปัญหา ดูแหล่งที่มา

ต่อไปนี้เครื่องโฮสต์จะเป็นเครื่องที่ Bazel เรียกใช้

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

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

การค้นหากฎที่ไม่เป็นไปตามเงื่อนไข

กฎ Workspace ช่วยให้นักพัฒนาซอฟต์แวร์เพิ่มทรัพยากร 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 แล้วเรียกใช้บิวด์

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

  3. ดาวน์โหลดซอร์สโค้ด Bazel และไปยังโฟลเดอร์ Bazel โดยใช้คําสั่งด้านล่าง คุณต้องมีซอร์สโค้ดเพื่อให้สามารถแยกวิเคราะห์บันทึกของพื้นที่ทํางานด้วยโปรแกรมแยกวิเคราะห์ loglog ได้

    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: เรียกใช้คําสั่งที่กําหนดเองในสภาพแวดล้อมของโฮสต์ ตรวจสอบว่าแอปเหล่านี้อาจทําให้เกิดทรัพยากร Dependency ในสภาพแวดล้อมของโฮสต์หรือไม่

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

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

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

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

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