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

รายงานปัญหา ดูแหล่งที่มา /3} /4} {3/4} {3/4} {3/4} {3/4} /4.

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

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

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

การค้นหากฎที่ไม่ขึ้นกับสัญชาตญาณ

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

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