
ระบบ Build หลายภาษา

Bazel คือเครื่องมือ Build และทดสอบแบบ Open-source ที่ออกแบบมาสำหรับ Repository ซอฟต์แวร์ขนาดใหญ่ที่รองรับหลายภาษา ต่างจากระบบ Build ดั้งเดิมอย่าง Make หรือ Maven ตรงที่ Bazel ใช้กระบวนการ Build แบบ Hermetic ที่ทำซ้ำได้ ซึ่งรับประกันผลลัพธ์ที่เหมือนกันทุกประการไม่ว่าจะอยู่ในสภาพแวดล้อมใด โดยใช้ประโยชน์จาก Content-addressable cache และการวิเคราะห์ Dependency graph แบบ Incremental เพื่อ Build เฉพาะส่วนที่จำเป็นเท่านั้น ซึ่งช่วยลดเวลาใน CI/CD Pipeline ได้อย่างมหาศาล Bazel เหมาะอย่างยิ่งสำหรับ Monorepo โดยรองรับ Codebase แบบ Polyglot (Java, C++, Go, Python ฯลฯ) ด้วยภาษาการตั้งค่าที่เป็นหนึ่งเดียว (Starlark) และเป็นเครื่องมือที่อยู่เบื้องหลัง Codebase ขนาดใหญ่ของ Google ทำให้เป็นมาตรฐานอุตสาหกรรมสำหรับองค์กรที่ต้องการการจัดการ Build ที่มีประสิทธิภาพสูงและขยายตัวได้
Bazel บังคับใช้การแยกส่วนอย่างเข้มงวดด้วยการทำ Sandboxing การกระทำต่างๆ โดยจำกัดการเข้าถึงเครื่องมือและไฟล์ระดับระบบ ทำให้มั่นใจได้ว่าการ Build จะทำซ้ำได้บนเครื่องของนักพัฒนาและ CI Server ต่างๆ ซึ่งช่วยขจัดปัญหา 'รันบนเครื่องฉันได้' โดยป้องกันการพึ่งพา State ของระบบส่วนกลางที่ซ่อนอยู่ เช่น ตัวแปรสภาพแวดล้อมหรือไลบรารีที่ติดตั้งไว้ล่วงหน้า ส่งผลให้ได้ Artifact ที่เชื่อถือได้และแน่นอน
Bazel ใช้ Dependency graph ที่ละเอียดเพื่อติดตามการเปลี่ยนแปลงในระดับไฟล์ต้นฉบับ เมื่อนักพัฒนาแก้ไขไฟล์ Bazel จะ Build เฉพาะ Target ที่ได้รับผลกระทบจากการเปลี่ยนแปลงนั้นเท่านั้น แทนที่จะ Build ทั้งโปรเจกต์ วิธีการที่ละเอียดนี้เมื่อรวมกับ Persistent action cache จะช่วยลดเวลาการ Build จากหลายชั่วโมงเหลือเพียงไม่กี่นาทีใน Repository ขนาดใหญ่ ซึ่งช่วยเพิ่มความเร็วในการพัฒนาและปริมาณงานของ CI ได้อย่างมาก
Bazel มอบอินเทอร์เฟซที่เป็นหนึ่งเดียวสำหรับการ Build Codebase ที่มีหลายภาษา ไม่ว่าโปรเจกต์ของคุณจะมี Java, C++, Go, Rust หรือ Python คุณก็ใช้คำสั่ง Build และไวยากรณ์การตั้งค่าเดียวกัน สิ่งนี้ช่วยขจัดความจำเป็นในการใช้ Toolchain ที่กระจัดกระจาย ทำให้ทีมวิศวกรสามารถจัดการ Microservices หรือ Monorepo ที่ซับซ้อนด้วยระบบ Build เดียวที่เข้าใจ Dependency ข้ามภาษา
Bazel รองรับการแคชระยะไกล ทำให้สามารถแชร์ Artifact ที่ Build แล้วได้ทั้งองค์กร หากเพื่อนร่วมงาน Build ไลบรารีใดไว้แล้ว เครื่องของคุณสามารถดาวน์โหลดผลลัพธ์ที่คอมไพล์ไว้ล่วงหน้าจากแคชแทนการคอมไพล์ใหม่ในเครื่องได้ ฟีเจอร์นี้ขยายตัวตามขนาดทีม ทำให้เวลาในการ Build ยังคงต่ำแม้ Codebase จะเติบโตขึ้น โดยเปลี่ยนผลลัพธ์การ Build ให้เป็นทรัพยากรส่วนกลางที่ใช้ร่วมกัน
Bazel ใช้ Starlark ซึ่งเป็นภาษาเซตย่อยที่คล้าย Python และมีความแน่นอนสำหรับการตั้งค่า Build โดย Starlark ถูกออกแบบมาให้ปลอดภัยและรวดเร็ว ป้องกันผลข้างเคียงระหว่างกระบวนการ Build ธรรมชาติแบบ Declarative ช่วยให้นักพัฒนากำหนดตรรกะการ Build ที่ซับซ้อนได้ง่ายต่อการอ่าน บำรุงรักษา และขยายผล พร้อมทั้งรับประกันว่า Build graph จะยังคงคาดการณ์ได้และมีประสิทธิภาพแม้ใน Repository ที่มีโค้ดหลายล้านบรรทัด
ติดตั้ง Bazel binary ผ่าน Package manager ของระบบหรือสคริปต์ติดตั้งของ Bazel, สร้างไฟล์ 'WORKSPACE' ใน Root ของโปรเจกต์เพื่อกำหนด Dependency ภายนอกและขอบเขตของโปรเจกต์, กำหนด Build targets ในไฟล์ 'BUILD' โดยใช้ Starlark พร้อมระบุไฟล์ต้นฉบับ, Dependency และกฎการมองเห็น, สั่ง Build ด้วยคำสั่ง 'bazel build //path/to:target' เพื่อคอมไพล์โค้ดเป็นผลลัพธ์แบบแยกส่วน (Sandboxed), รันการทดสอบด้วย 'bazel test //path/to:target' เพื่อใช้ประโยชน์จากผลลัพธ์ที่แคชไว้และการประมวลผลแบบขนาน, ค้นหา Dependency graph ด้วย 'bazel query' เพื่อแสดงภาพและดีบั๊กความสัมพันธ์ของการ Build ที่ซับซ้อน
ทีมวิศวกรขนาดใหญ่ที่จัดการ Microservices หลายพันรายการใน Repository เดียวใช้ Bazel เพื่อรักษาความสม่ำเสมอในการ Build ช่วยให้นักพัฒนาทดสอบเฉพาะบริการที่ได้รับผลกระทบจากการเปลี่ยนแปลง ป้องกันการ Build ทั้ง Repo โดยไม่จำเป็น และรับประกันว่า Dependency ข้ามบริการจะได้รับการแก้ไขอย่างถูกต้องเสมอ
ทีม DevOps รวม Bazel เข้ากับ CI Pipeline เพื่อลดเวลาการ Build โดยการใช้ Remote execution และการแคช บริษัทสามารถรันชุดการทดสอบขนาดใหญ่แบบขนานบนคลัสเตอร์ ลดรอบการตอบกลับจากชั่วโมงเหลือนาที และลดค่าใช้จ่ายด้าน Cloud compute
องค์กรที่มี Stack หลายภาษา (เช่น Backend ภาษา Go กับโมดูล Data Science ภาษา Python และ C++ Performance kernels) ใช้ Bazel เพื่อสร้าง Pipeline การ Build ที่เป็นหนึ่งเดียว ซึ่งจัดการการเชื่อมโยงข้ามภาษาและการแก้ไข Dependency ที่ซับซ้อนซึ่งเครื่องมือเฉพาะภาษาทั่วไปไม่สามารถทำได้
ต้องการสร้างและดูแลโครงสร้างพื้นฐาน CI/CD ที่ขยายตัวได้และเชื่อถือได้ Bazel มอบ Primitive ที่จำเป็นสำหรับการ Build แบบ Hermetic และ Remote execution ซึ่งช่วยแก้ปัญหาการ Build ที่ไม่เสถียรและรอบการตอบกลับที่ช้าในองค์กรขนาดใหญ่
จัดการ Codebase ที่ซับซ้อนและมีหลายภาษาโดยต้องการมาตรฐานการ Build ที่เป็นหนึ่งเดียว Bazel ช่วยให้พวกเขาสามารถบังคับใช้รูปแบบการ Build และการจัดการ Dependency ที่สม่ำเสมอทั่วทั้งทีมที่หลากหลาย เพื่อรับประกันความสามารถในการบำรุงรักษาโปรเจกต์ในระยะยาว
มุ่งเน้นการเพิ่มประสิทธิภาพการ Build และลดค่าใช้จ่ายโครงสร้างพื้นฐาน Cloud ความสามารถในการแคชระยะไกลและการประมวลผลแบบกระจายของ Bazel ช่วยให้พวกเขาเพิ่มการใช้ประโยชน์จากฮาร์ดแวร์ให้สูงสุดและลดเวลาว่างในคลัสเตอร์การ Build
Open source (Apache License 2.0) ใช้งานและแก้ไขได้ฟรีโดยสมบูรณ์ มีบริการสนับสนุนระดับองค์กรผ่านผู้ให้บริการภายนอก