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

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

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

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

การค้นหากฎที่ไม่เป็นแบบ Hermetic

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

ตั้งแต่ Bazel 0.18 เป็นต้นไป คุณจะได้รับบันทึกการดำเนินการที่อาจไม่เป็นแบบ Hermetic บางอย่างโดยเพิ่มแฟล็ก --experimental_workspace_rules_log_file=[PATH] ลงในคำสั่ง Bazel โดย [PATH] คือชื่อไฟล์ที่จะสร้างบันทึก

สิ่งที่ควรทราบ

  • บันทึกจะบันทึกเหตุการณ์เมื่อมีการดำเนินการ หากมีการแคชบางขั้นตอน ขั้นตอนเหล่านั้นจะไม่ปรากฏในบันทึก ดังนั้นอย่าลืมเรียกใช้ bazel clean --expunge ก่อนเพื่อดูผลลัพธ์ทั้งหมด

  • บางครั้งระบบอาจดำเนินการฟังก์ชันซ้ำ ในกรณีนี้ เหตุการณ์ที่เกี่ยวข้องจะปรากฏในบันทึกหลายครั้ง

  • ปัจจุบันกฎพื้นที่ทำงานจะบันทึกเหตุการณ์ 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 ข้อความที่สรุปการดำเนินการบางอย่างที่อาจไม่เป็นแบบ Hermetic ซึ่งดำเนินการใน repository_ctx

การดำเนินการที่ไฮไลต์ว่าอาจไม่เป็นแบบ Hermetic มีดังนี้

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

  • download, download_and_extract: ตรวจสอบว่าได้ระบุ sha256 แล้วเพื่อให้แน่ใจว่าการสร้างเป็นแบบ Hermetic

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

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

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

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