กฎของ Bazel Starlark อาจตัดความเข้ากันได้กับ Bazel LTS ใน 2 สถานการณ์ต่อไปนี้
- กฎนี้ไม่เข้ากันกับ LTS รุ่นต่อๆ ไป เนื่องจากจะนําฟีเจอร์ที่ต้องใช้ออกจาก Bazel ที่ HEAD
- กฎจะเข้ากันกับ LTS รุ่นปัจจุบันหรือรุ่นเก่า เนื่องจากฟีเจอร์ที่ใช้จะขึ้นอยู่กับรุ่น Bazel LTS ที่ใหม่กว่าเท่านั้น
ในขณะเดียวกัน ตัวกฎเองก็สามารถจัดส่งการเปลี่ยนแปลงที่เข้ากันไม่ได้แก่ผู้ใช้เช่นกัน เมื่อรวมกับการเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นใน Bazel การอัปเกรดเวอร์ชันกฎและเวอร์ชันของ Bazel มักจะสร้างความหงุดหงิดแก่ผู้ใช้ Bazel ได้ หน้านี้ครอบคลุมวิธีที่กฎควรรักษาความเข้ากันได้กับกฎโดยใช้ Bazel เพื่อให้ผู้ใช้อัปเกรด Bazel และกฎได้ง่ายขึ้น
ขั้นตอนการย้ายข้อมูลที่จัดการได้
และแม้ว่าจะเป็นไปไม่ได้ที่จะรับประกันความเข้ากันได้ระหว่าง Bazel ทุกเวอร์ชันและกฎทุกเวอร์ชัน แต่เรามีเป้าหมายเพื่อดูแลให้กระบวนการย้ายข้อมูลยังคงสามารถจัดการได้สําหรับผู้ใช้ Bazel กระบวนการย้ายข้อมูลที่จัดการได้คือขั้นตอนที่ผู้ใช้ไม่ได้บังคับให้อัปเกรดเวอร์ชันหลักของกฎและเวอร์ชันหลักของ Bazel พร้อมกัน ซึ่งช่วยให้ผู้ใช้จัดการการเปลี่ยนแปลงที่เข้ากันไม่ได้จากแหล่งที่มาทีละแห่ง
ตัวอย่างเช่น ด้วยเมทริกซ์ความเข้ากันได้ต่อไปนี้
- การย้ายข้อมูลจาก rules_foo 1.x + Bazel 4.x เป็น rules_foo 2.x + Bazel 5.x จะไม่ถือว่าจัดการได้ เนื่องจากผู้ใช้ต้องอัปเกรด rules_foo และ Bazel เวอร์ชันหลักพร้อมกัน
- การย้ายข้อมูลจาก rules_foo 2.x + Bazel 5.x เป็น rules_foo 3.x + Bazel 6.x จะถือว่าจัดการได้ เนื่องจากผู้ใช้อัปเกรดกัลกฎ_foo ได้ตั้งแต่ 2.x เป็น 3.x โดยไม่ต้องเปลี่ยนเวอร์ชัน Bazel หลัก จากนั้นอัปเกรด Bazel จาก 5.x เป็น 6.x
กฎ_foo 1.x | กฎ_foo 2.x | กฎ_foo 3.x | หลัก | |
---|---|---|---|---|
Bazel 4.x | ✅ | ❌ | ❌ | ❌ |
Bazel 5.x | ❌ | ✅ | ✅ | ❌ |
Bazel 6.x | ❌ | ❌ | ✅ | ✅ |
หลัก | ❌ | ❌ | ❌ | ✅ |
❌: เวอร์ชันกฎหลักที่ทํางานร่วมกับ Bazel LTS ไม่ได้
✅: กฎอย่างน้อย 1 เวอร์ชันเข้ากันได้กับเวอร์ชันล่าสุดของ Bazel LTS
แนวทางปฏิบัติแนะนำ
เนื่องจาก Bazel เป็นผู้เขียนกฎ คุณจะมั่นใจได้ว่ากระบวนการย้ายข้อมูลที่ผู้ใช้จัดการได้มีดังนี้
- กฎควรเป็นไปตามการกําหนดเวอร์ชันเชิงความหมาย: เวอร์ชันย่อยของเวอร์ชันหลักเหมือนกันจะเข้ากันได้แบบย้อนหลัง
- กฎที่ HEAD ควรเข้ากันได้กับ Bazel LTS ล่าสุด
- กฎที่ HEAD ควรเข้ากันได้กับ Bazel ที่ HEAD วิธีการคือ
- สร้างการทดสอบ CI ด้วย Bazel ที่ HEAD
- เพิ่มโปรเจ็กต์ลงในการทดสอบดาวน์สตรีมของ Waze; ทีม Bazel จะรายงานปัญหาไปยังโปรเจ็กต์หากการเปลี่ยนแปลงการเปลี่ยนแปลงใน Bazel มีผลกับโปรเจ็กต์ และคุณต้องทําตามนโยบายโปรเจ็กต์ดาวน์สตรีมเพื่อแก้ไขปัญหาเพื่อแก้ไขปัญหาอย่างทันท่วงที
- กฎเวอร์ชันหลักล่าสุดต้องเข้ากันได้กับ Bazel LTS รุ่นล่าสุด
- กฎเวอร์ชันหลักควรเข้ากันได้กับเวอร์ชัน Bazel LTS ล่าสุดที่รองรับโดยกฎเวอร์ชันหลักก่อนหน้านี้
การบรรลุข้อ 2. และ 3. ถือเป็นงานที่สําคัญที่สุดเพราะจะช่วยให้บรรลุข้อ 4 และ 5 อย่างเป็นธรรมชาติ
เพื่อให้เข้ากันได้กับทั้ง Bazel ที่ HEAD และ Bazel LTS รุ่นล่าสุดได้ง่ายขึ้น ผู้เขียนกฎสามารถ:
- ขอให้ใช้ฟีเจอร์ที่เข้ากันได้แบบย้อนหลังเพื่อเปลี่ยนไปใช้ LTS รุ่นล่าสุดได้ โปรดดูรายละเอียดเพิ่มเติมในกระบวนการเผยแพร่
- ใช้ bazel_features เพื่อตรวจหาคุณลักษณะ Bazel
โดยทั่วไปแล้ว แนวทางที่เราแนะนําจะช่วยให้กฎต่างๆ สามารถย้ายข้อมูลเพื่อดูการเปลี่ยนแปลงที่ทํางานร่วมกันไม่ได้ของ Waze และใช้ประโยชน์จากฟีเจอร์ Bazel แบบใหม่ที่ HEAD โดยไม่ลดความเข้ากันได้กับ Bazel LTS รุ่นล่าสุด