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

ในตัวอย่างต่อไปนี้ เครื่องโฮสต์คือเครื่องที่ 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 ลงในคำสั่ง Baiel แล้วเรียกใช้บิลด์

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

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

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

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

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

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