ต่อไปนี้ เครื่องโฮสต์คือเครื่องที่ Bazel ทำงานอยู่
เมื่อใช้การดําเนินการจากระยะไกล ขั้นตอนการสร้างและ/หรือการทดสอบจริงจะไม่เกิดขึ้นบนเครื่องโฮสต์ แต่ระบบจะส่งไปยังระบบการดําเนินการจากระยะไกลแทน แต่ขั้นตอนที่เกี่ยวข้องกับการแก้ไขกฎของพื้นที่ทำงานจะเกิดขึ้นในเครื่องโฮสต์ หากกฎของเวิร์กスペースเข้าถึงข้อมูลเกี่ยวกับเครื่องโฮสต์เพื่อใช้งานระหว่างการดำเนินการ บิลด์มีแนวโน้มที่จะใช้งานไม่ได้เนื่องจากสภาพแวดล้อมไม่เข้ากันได้
เนื่องจากการปรับกฎ Bazel สำหรับการดำเนินการระยะไกล คุณจะต้องค้นหาและแก้ไขกฎพื้นที่ทำงานดังกล่าว หน้านี้จะอธิบายวิธีค้นหากฎของพื้นที่ทำงานที่อาจทำให้เกิดปัญหาโดยใช้บันทึกของพื้นที่ทำงาน
การค้นหากฎที่ไม่ใช่แบบปิด
กฎพื้นที่ทำงานช่วยให้นักพัฒนาซอฟต์แวร์เพิ่มทรัพยากร Dependency ไปยังพื้นที่ทำงานภายนอกได้ แต่ก็มีข้อมูลมากพอที่จะทำให้ระบบประมวลผลได้อย่างอิสระ คำสั่งที่เกี่ยวข้องทั้งหมดจะดำเนินการในเครื่องและอาจเป็นแหล่งที่มาที่อาจทำให้เกิดช่องโหว่ โดยปกติแล้ว ลักษณะการทำงานที่ไม่ปิดผนึกจะแสดงผ่าน repository_ctx
ซึ่งช่วยให้โต้ตอบกับเครื่องโฮสต์ได้
ตั้งแต่ Bazel 0.18 เป็นต้นไป คุณสามารถรับบันทึกการดำเนินการบางส่วนที่อาจไม่เกี่ยวข้องกับธรรมชาติได้โดยการเพิ่ม Flag --experimental_workspace_rules_log_file=[PATH]
ในคำสั่ง Bazel [PATH]
คือชื่อไฟล์ที่ใช้สร้างบันทึก
สิ่งที่ควรทราบ
บันทึกจะบันทึกเหตุการณ์เมื่อมีการเรียกใช้ หากแคชขั้นตอนไว้ ขั้นตอนเหล่านั้นจะไม่แสดงในบันทึก ดังนั้นอย่าลืมเรียกใช้
bazel clean --expunge
ล่วงหน้าเพื่อให้ได้ผลลัพธ์ที่สมบูรณ์บางครั้งฟังก์ชันอาจมีการดำเนินการซ้ำ ซึ่งในกรณีนี้เหตุการณ์ที่เกี่ยวข้องจะปรากฏขึ้นในบันทึกหลายครั้ง
ขณะนี้กฎ Workspace บันทึกเฉพาะเหตุการณ์ Starlark เท่านั้น
วิธีค้นหาสิ่งที่ดำเนินการระหว่างการเริ่มต้นใช้งานพื้นที่ทำงาน
เรียกใช้
bazel clean --expunge
คำสั่งนี้จะล้างแคชในเครื่องและที่เก็บที่แคชไว้ทั้งหมดเพื่อให้การเริ่มต้นทั้งหมดทำงานอีกครั้งเพิ่ม
--experimental_workspace_rules_log_file=/tmp/workspacelog
ลงในคำสั่ง Bazel และเรียกใช้บิลด์ซึ่งจะสร้างไฟล์โปรโตคอลแบบไบนารีที่แสดงรายการข้อความประเภท WorkspaceEvent
ดาวน์โหลดซอร์สโค้ด Bazel และไปที่โฟลเดอร์ Bazel โดยใช้คำสั่งด้านล่าง คุณต้องมีซอร์สโค้ดจึงจะแยกวิเคราะห์บันทึกพื้นที่ทำงานด้วยโปรแกรมแยกวิเคราะห์ workspacelog ได้
git clone https://github.com/bazelbuild/bazel.git
cd bazel
แปลงบันทึกพื้นที่ทำงานทั้งหมดเป็นข้อความในที่เก็บซอร์สโค้ด Bazel
bazel build src/tools/workspacelog:parser
bazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog > /tmp/workspacelog.txt
เอาต์พุตอาจมีความละเอียดมากและมีเอาต์พุตจากกฎ 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
เปิด
/tmp/workspacelog.txt
และตรวจหาการดำเนินการที่ไม่ปลอดภัย
บันทึกประกอบด้วยข้อความ WorkspaceEvent ที่อธิบายการดำเนินการบางอย่างแบบไม่เป็นองค์ประกอบซึ่งทำใน repository_ctx
การดำเนินการที่มีการไฮไลต์ว่าอาจไม่ได้เป็นองค์ประกอบสำคัญมีดังนี้
execute
: ดำเนินการคำสั่งใดก็ได้ในสภาพแวดล้อมโฮสต์ ตรวจสอบว่าไฟล์เหล่านี้อาจทำให้เกิดข้อกำหนดในสภาพแวดล้อมโฮสต์หรือไม่download
,download_and_extract
: ตรวจสอบว่าได้ระบุ sha256 แล้วเพื่อให้แน่ใจว่าเป็นบิลด์แบบปิดfile
,template
: เงื่อนไขนี้ไม่ใช่ตัวแปรในตัวเอง แต่อาจเป็นกลไกสำหรับการนำทรัพยากร Dependency ในสภาพแวดล้อมของโฮสต์ไปยังที่เก็บ คุณควรเข้าใจว่าอินพุตมาจากไหน และไม่ได้ขึ้นอยู่กับสภาพแวดล้อมของโฮสต์os
: วิธีนี้ไม่ได้เป็นแบบเฉพาะตัว แต่เป็นวิธีง่ายๆ ในการรับทรัพยากร Dependency ในสภาพแวดล้อมของโฮสต์ โดยทั่วไปงานสร้างที่แยกต่างหากจะไม่เรียกว่าสิ่งนี้ ในการประเมินว่าการใช้งานของคุณเป็นแบบปิดผนึกหรือไม่ โปรดทราบว่าการดำเนินการนี้ทำงานบนโฮสต์ ไม่ใช่บนเวิร์กเกอร์ โดยทั่วไปแล้ว การรับข้อมูลเฉพาะของสภาพแวดล้อมจากโฮสต์ไม่ใช่แนวทางที่ดีสำหรับบิลด์ระยะไกลsymlink
: โดยทั่วไปแล้วปลอดภัย แต่มองหาสัญญาณสีแดง ลิงก์สัญลักษณ์ที่ไปยังภายนอกที่เก็บหรือไปยังเส้นทางสัมบูรณ์จะทำให้เกิดปัญหาในเวิร์กเกอร์ระยะไกล หากสร้างลิงก์สัญลักษณ์ตามพร็อพเพอร์ตี้ของเครื่องโฮสต์ ก็อาจมีปัญหาเช่นกันwhich
: การตรวจสอบโปรแกรมที่ติดตั้งในโฮสต์มักจะมีปัญหาเนื่องจากผู้ปฏิบัติงานอาจมีการกำหนดค่าที่แตกต่างกัน