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

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

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

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

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

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

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

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