Câu hỏi thường gặp

Nếu bạn có thắc mắc hoặc cần hỗ trợ, hãy xem phần Nhận trợ giúp.

Bazel là gì?

Bazel là công cụ tự động hoá các bản dựng và hoạt động kiểm thử phần mềm. Các tác vụ xây dựng được hỗ trợ bao gồm chạy trình biên dịch và trình liên kết để tạo chương trình và thư viện có thể thực thi, tập hợp các gói có thể triển khai cho Android, iOS và các môi trường mục tiêu khác. Bazel cũng tương tự như các công cụ khác như Make, Ant, Gradle, Buck, Pants và Maven.

Bazel có gì đặc biệt?

Bazel được thiết kế để phù hợp với cách phát triển phần mềm tại Google. Cách này có các tính năng sau:

  • Hỗ trợ đa ngôn ngữ: Bazel hỗ trợ nhiều ngôn ngữ, và có thể mở rộng để hỗ trợ các ngôn ngữ lập trình tuỳ ý.
  • Ngôn ngữ xây dựng cấp cao: Dự án được mô tả bằng ngôn ngữ BUILD, một định dạng văn bản ngắn gọn, mô tả dự án dưới dạng tập hợp các thư viện liên kết nhỏ, tệp nhị phân và hoạt động kiểm thử. Ngược lại, với các công cụ như Make, bạn phải mô tả từng tệp và lệnh gọi trình biên dịch.
  • Hỗ trợ đa nền tảng: Bạn có thể sử dụng cùng một công cụ và các tệp BUILD giống nhau để xây dựng phần mềm cho nhiều kiến trúc và thậm chí là nhiều nền tảng. Tại Google, chúng tôi sử dụng Bazel để xây dựng mọi thứ, từ các ứng dụng máy chủ chạy trên các hệ thống trong trung tâm dữ liệu của chúng tôi đến các ứng dụng khách chạy trên điện thoại di động.
  • Khả năng tái tạo: Trong các tệp BUILD, mỗi thư viện, hoạt động kiểm thử và tệp nhị phân đều phải chỉ định đầy đủ các phần phụ thuộc trực tiếp. Bazel sử dụng thông tin về phần phụ thuộc này để biết cần phải tạo lại những gì khi thay đổi tệp nguồn, cũng như tác vụ nào có thể chạy song song. Điều này có nghĩa là tất cả các bản dựng đều tăng dần và sẽ luôn tạo ra cùng một kết quả.
  • Có thể mở rộng: Bazel có thể xử lý các bản dựng lớn; tại Google, một tệp nhị phân của máy chủ thường có 100 nghìn tệp nguồn và các bản dựng không có tệp nào được thay đổi sẽ mất khoảng 200 mili giây.

Tại sao Google không sử dụng...?

  • Tạo, Ninja: Các công cụ này cung cấp quyền kiểm soát rất chính xác đối với những lệnh được gọi để tạo tệp, nhưng người dùng có quyền viết quy tắc chính xác hay không.
    • Người dùng tương tác với Bazel ở cấp độ cao hơn. Ví dụ: Bazel tích hợp sẵn các quy tắc cho "kiểm thử Java", "tệp nhị phân C++" và các khái niệm như "nền tảng mục tiêu" và "nền tảng lưu trữ". Những quy tắc này đã được thử nghiệm để đảm bảo chắc chắn.
  • Ant và Maven: Ant và Maven chủ yếu hướng đến Java, trong khi Bazel xử lý nhiều ngôn ngữ. Bazel khuyến khích chia nhỏ cơ sở mã thành các đơn vị nhỏ hơn có thể sử dụng lại và chỉ có thể xây dựng lại những đơn vị cần xây dựng lại. Điều này giúp đẩy nhanh quá trình phát triển khi làm việc với các cơ sở mã lớn hơn.
  • Gradle: Các tệp cấu hình Bazel có cấu trúc phức tạp hơn nhiều so với Gradle, cho phép Bazel hiểu chính xác chức năng của từng hành động. Điều này cho phép cải thiện khả năng tải song song và khả năng tái tạo tốt hơn.
  • Quần, Buck: Cả hai công cụ này đều do các cựu nhân viên của Google tại Twitter và Foursquare và Facebook lần lượt tạo ra và phát triển. Các thành phần này được mô hình hoá dựa trên Bazel, nhưng các bộ tính năng của chúng lại khác nhau nên không phải là giải pháp thay thế khả thi.

Bazel đến từ đâu?

Bazel là một phiên bản của công cụ mà Google sử dụng để xây dựng phần mềm máy chủ trong nội bộ. Công ty này cũng đã mở rộng để phát triển các phần mềm khác, như các ứng dụng dành cho thiết bị di động (iOS, Android) kết nối với máy chủ của chúng tôi.

Bạn có viết lại công cụ nội bộ của mình dưới dạng nguồn mở không? Đó có phải là một cái nĩa không?

Bazel chia sẻ hầu hết các mã của mình với công cụ nội bộ và các quy tắc của công cụ này được sử dụng cho hàng triệu bản dựng mỗi ngày.

Tại sao Google tạo ra Bazel?

Cách đây một thời gian, Google đã phát triển phần mềm của mình bằng cách sử dụng Makefiles lớn và được tạo. Điều này dẫn đến các bản dựng chậm và không đáng tin cậy, bắt đầu ảnh hưởng đến năng suất của các nhà phát triển và tính linh hoạt của công ty. Bazel là một cách để giải quyết những vấn đề này.

Bazel có cần một cụm bản dựng không?

Bazel chạy các hoạt động xây dựng cục bộ theo mặc định. Tuy nhiên, Bazel cũng có thể kết nối với một cụm bản dựng để tạo các bản dựng và bài kiểm thử nhanh hơn nữa. Hãy xem tài liệu của chúng tôi về lưu vào bộ nhớ đệm và thực thi từ xa cũng như lưu vào bộ nhớ đệm từ xa để biết thêm chi tiết.

Quy trình phát triển của Google hoạt động như thế nào?

Đối với cơ sở mã máy chủ, chúng ta sử dụng quy trình phát triển sau đây:

  • Tất cả mã máy chủ của chúng tôi đều nằm trong một hệ thống quản lý phiên bản khổng lồ.
  • Mọi người xây dựng phần mềm của mình nhờ Bazel.
  • Các nhóm khác nhau sở hữu các phần khác nhau trong cây nguồn và cung cấp các thành phần của họ dưới dạng mục tiêu BUILD.
  • Tính năng phân nhánh chủ yếu được dùng để quản lý các bản phát hành, vì vậy, mọi người đều phát triển phần mềm của mình ngay từ đầu.

Bazel là nền móng của triết lý này: vì Bazel yêu cầu tất cả các phần phụ thuộc phải được chỉ định đầy đủ, nên chúng tôi có thể dự đoán những chương trình và thử nghiệm nào bị ảnh hưởng bởi một thay đổi và xem xét lại chúng trước khi gửi.

Bạn có thể tìm thêm thông tin cơ bản về quá trình phát triển tại Google trên blog về các công cụ kỹ thuật.

Vì sao YouTube mở cửa cơ sở Bazel?

Xây dựng phần mềm phải thú vị và dễ dàng. Những bản dựng chậm và khó dự đoán sẽ làm mất đi sự thú vị khi lập trình.

Tại sao tôi nên dùng Bazel?

  • Bazel có thể cho bạn thời gian xây dựng nhanh hơn vì công cụ này chỉ có thể biên dịch lại những tệp cần biên dịch lại. Tương tự, nó có thể bỏ qua việc chạy lại các kiểm thử mà nó biết rằng chưa thay đổi.
  • Bazel đưa ra kết quả xác định. Điều này giúp loại bỏ sự sai lệch giữa các bản dựng tăng dần và sạch, máy tính xách tay và hệ thống CI, v.v.
  • Bazel có thể tạo nhiều ứng dụng khách và ứng dụng máy chủ bằng cùng một công cụ trong cùng một không gian làm việc. Ví dụ: bạn có thể thay đổi giao thức máy khách/máy chủ trong một lệnh xác nhận duy nhất và kiểm thử để đảm bảo rằng ứng dụng di động được cập nhật hoạt động với máy chủ đã cập nhật, xây dựng cả hai bằng cùng một công cụ, khai thác tất cả lợi ích nói trên của Bazel.

Tôi có thể xem các ví dụ không?

Có; hãy xem ví dụ đơn giản hoặc đọc Mã nguồn Bazel để biết ví dụ phức tạp hơn.

Bazel giỏi nhất ở lĩnh vực nào?

Bazel chuyên xây dựng và thử nghiệm các dự án với các tài sản sau đây:

  • Dự án có cơ sở mã lớn
  • Dự án được viết bằng (nhiều) ngôn ngữ đã biên dịch
  • Các dự án triển khai trên nhiều nền tảng
  • Dự án có nhiều thử nghiệm

Tôi có thể chạy Bazel ở đâu?

Bazel chạy trên Linux, macOS (OS X) và Windows.

Việc chuyển đổi sang các nền tảng UNIX khác sẽ tương đối dễ dàng, miễn là nền tảng đó có JDK.

Tôi không nên sử dụng Bazel để làm gì?

  • Bazel cố gắng lưu vào bộ nhớ đệm một cách thông minh. Điều này có nghĩa là hàm này không phù hợp để chạy các hoạt động xây dựng có kết quả không được lưu vào bộ nhớ đệm. Ví dụ: bạn không nên chạy các bước sau đây từ Bazel:
    • Một bước biên dịch tìm nạp dữ liệu từ Internet.
    • Một bước kiểm thử kết nối với bản sao đảm bảo chất lượng của trang web.
    • Bước triển khai thay đổi cấu hình đám mây của trang web.
  • Nếu bản dựng của bạn bao gồm một vài bước liên tiếp dài hạn, thì Bazel có thể không giúp được gì nhiều. Bạn sẽ tăng tốc độ bằng cách chia các bước dài thành các mục tiêu nhỏ hơn, riêng biệt mà Bazel có thể chạy song song.

Bộ tính năng của Bazel có ổn định không?

Các tính năng cốt lõi (quy tắc C++, Java và shell) được sử dụng rộng rãi trong Google, vì vậy chúng được kiểm thử kỹ lưỡng và có rất ít tỷ lệ người dùng rời bỏ. Tương tự, chúng tôi thử nghiệm các phiên bản mới của Bazel trên hàng trăm nghìn mục tiêu mỗi ngày để tìm lỗi hồi quy và mỗi tháng chúng tôi phát hành phiên bản mới nhiều lần.

Nói ngắn gọn, ngoại trừ các tính năng được đánh dấu là thử nghiệm, Bazel chỉ nên hoạt động. Các thay đổi đối với quy tắc không thử nghiệm sẽ có khả năng tương thích ngược. Bạn có thể xem danh sách chi tiết hơn về các trạng thái hỗ trợ tính năng trong tài liệu hỗ trợ của chúng tôi.

Bazel ở dạng tệp nhị phân ổn định đến mức nào?

Bên trong Google, chúng tôi đảm bảo rằng các sự cố của Bazel là rất hiếm khi xảy ra. Điều này cũng sẽ phù hợp với cơ sở mã nguồn mở của chúng ta.

Làm cách nào để bắt đầu dùng Bazel?

Hãy xem mục Bắt đầu.

Docker không giải quyết được các vấn đề về khả năng tái tạo phải không?

Với Docker, bạn có thể dễ dàng tạo hộp cát với các bản phát hành hệ điều hành cố định, ví dụ: Ubuntu 12.04, Fedora 21. Điều này giải quyết vấn đề về khả năng tái tạo của môi trường hệ thống – tức là “tôi cần phiên bản /usr/bin/c++ nào?”

Docker không giải quyết vấn đề về khả năng tái tạo có liên quan đến các thay đổi trong mã nguồn. Việc chạy Make bằng một tệp Makefile được viết không hoàn hảo bên trong vùng chứa Docker vẫn có thể mang lại các kết quả ngoài dự đoán.

Bên trong Google, chúng tôi kiểm tra các công cụ để kiểm soát nguồn nhằm cải thiện khả năng tái tạo. Bằng cách này, chúng ta có thể xem xét các thay đổi đối với công cụ (“nâng cấp GCC lên 4.6.1”) với cơ chế tương tự như các thay đổi đối với thư viện cơ sở (“kiểm tra giới hạn sửa trong OpenSSL”).

Tôi có thể tạo tệp nhị phân để triển khai trên Docker không?

Với Bazel, bạn có thể tạo các tệp nhị phân độc lập, được liên kết tĩnh trong C/C++ cũng như các tệp jar độc lập cho Java. Các công cụ này chạy mà không cần nhiều phần phụ thuộc trên các hệ thống UNIX thông thường, và do đó, việc cài đặt rất đơn giản bên trong vùng chứa Docker.

Bazel có các quy ước về cấu trúc các chương trình phức tạp hơn, ví dụ: chương trình Java sử dụng một tập hợp tệp dữ liệu hoặc chạy một chương trình khác dưới dạng quy trình con. Bạn có thể đóng gói các môi trường như vậy dưới dạng các kho lưu trữ độc lập để có thể triển khai các môi trường này trên nhiều hệ thống, bao gồm cả các hình ảnh Docker.

Tôi có thể tạo hình ảnh Docker bằng Bazel không?

Có, bạn có thể sử dụng quy tắc Docker để tạo hình ảnh Docker có thể mô phỏng.

Bazel có tự động tái tạo các bản dựng của tôi không?

Đối với các tệp nhị phân Java và C++, có, giả sử bạn không thay đổi chuỗi công cụ. Nếu có các bước xây dựng liên quan đến công thức nấu ăn tuỳ chỉnh (ví dụ: thực thi tệp nhị phân thông qua tập lệnh shell bên trong một quy tắc), bạn sẽ cần hết sức cẩn trọng hơn:

  • Không sử dụng các phần phụ thuộc chưa được khai báo. Phương thức thực thi hộp cát (–spawn_strategy=sandboxed, chỉ có trên Linux) có thể giúp tìm các phần phụ thuộc chưa khai báo.
  • Tránh lưu trữ dấu thời gian và mã nhận dạng người dùng trong các tệp được tạo. Các tệp ZIP và các tệp lưu trữ khác đặc biệt dễ gặp vấn đề này.
  • Tránh kết nối mạng. Thực thi hộp cát cũng có thể hữu ích trong trường hợp này.
  • Tránh các quy trình sử dụng số ngẫu nhiên, cụ thể là việc truyền tải từ điển có tính ngẫu nhiên trong nhiều ngôn ngữ lập trình.

Bạn có bản phát hành nhị phân không?

Có, bạn có thể tìm thấy tệp nhị phân của bản phát hành mới nhất và xem chính sách phát hành của chúng tôi

Tôi sử dụng Eclipse/IntelliJ/XCode. Bazel tương tác với các IDE như thế nào?

Đối với IntelliJ, hãy xem trình bổ trợ IntelliJ với Bazel.

Đối với XCode, hãy xem Tulsi.

Đối với Eclipse, hãy xem trình bổ trợ E4B.

Đối với các IDE khác, hãy xem bài đăng trên blog về cách hoạt động của các trình bổ trợ này.

Tôi sử dụng Jenkins/CircleCI/TravisCI. Bazel tương tác với các hệ thống CI như thế nào?

Bazel trả về mã thoát khác 0 nếu lệnh gọi bản dựng hoặc thử nghiệm không thành công. Điều này là đủ để tích hợp CI cơ bản. Vì Bazel không cần các bản dựng sạch để đảm bảo độ chính xác, bạn không nên định cấu hình hệ thống CI để dọn dẹp trước khi bắt đầu chạy bản dựng/kiểm thử.

Bạn có thể xem thêm thông tin chi tiết về mã thoát trong Hướng dẫn sử dụng.

Chúng tôi có thể mong đợi những tính năng nào trong tương lai ở Bazel?

Xem Lộ trình của chúng tôi.

Tôi có thể sử dụng Bazel cho dự án CHÈN NGÔN NGỮ TẠI ĐÂY không?

Tiếng Bazel có thể mở rộng. Bất cứ ai cũng có thể thêm tính năng hỗ trợ cho các ngôn ngữ mới. Hỗ trợ nhiều ngôn ngữ: hãy xem bách khoa toàn thư về xây dựng để xem danh sách các đề xuất và tham khảo awesomebazel.com để xem danh sách đầy đủ hơn.

Nếu bạn muốn phát triển phần mở rộng hoặc tìm hiểu cách hoạt động của phần mở rộng, hãy xem tài liệu về cách mở rộng Bazel.

Tôi có thể đóng góp cho cơ sở mã Bazel không?

Hãy xem nguyên tắc đóng góp của chúng tôi.

Tại sao không phải mọi hoạt động phát triển đều được triển khai công khai?

Chúng tôi vẫn phải thường xuyên tái cấu trúc giao diện giữa mã công khai trong Bazel và các tiện ích nội bộ của mình. Điều này gây khó khăn cho việc phát triển ngoài trời.

Bạn đã tìm được nguồn mở cho Bazel chưa?

Quy trình tìm nguồn mở của Bazel đang trong quá trình hoàn thiện. Cụ thể, chúng tôi vẫn đang xây dựng nguồn mở:

  • Nhiều chương trình kiểm thử đơn vị và tích hợp của chúng tôi (giúp việc đóng góp các bản vá dễ dàng hơn).
  • Tích hợp đầy đủ IDE.

Ngoài mã lập trình, chúng tôi mong muốn mọi quyết định về thiết kế, theo dõi lỗi và đánh giá mã đều diễn ra công khai với sự tham gia của cộng đồng Bazel. Chúng tôi chưa có tính năng này nên một số thay đổi sẽ chỉ xuất hiện trong kho lưu trữ Bazel mà không có nội dung giải thích rõ ràng. Mặc dù thiếu tính minh bạch này, chúng tôi muốn hỗ trợ các nhà phát triển bên ngoài và cộng tác. Do đó, chúng tôi đang mở mã này, mặc dù một số quá trình phát triển vẫn đang diễn ra trong nội bộ Google. Vui lòng cho chúng tôi biết nếu có điều gì không rõ ràng hoặc phi lý khi chúng tôi chuyển sang mô hình mở.

Có phần nào của Bazel sẽ không bao giờ được cung cấp nguồn mở không?

Có, một số cơ sở mã tích hợp với công nghệ dành riêng cho Google hoặc chúng tôi vẫn tìm kiếm lý do để loại bỏ (hoặc kết hợp cả hai). Những phần này của cơ sở mã không có trên GitHub và có thể sẽ không bao giờ có.

Làm cách nào để liên hệ với nhóm?

Chúng tôi có thể liên hệ với chúng tôi tại địa chỉ bazel-discuss@googlegroups.com.

Tôi có thể báo cáo lỗi ở đâu?

Mở một vấn đề trên GitHub.

Chuyện gì xảy ra với từ “Blaze” trong cơ sở mã?

Đây là tên nội bộ của công cụ. Vui lòng gọi Bazel là Bazel.

Tại sao các dự án khác của Google (Android, Chrome) lại sử dụng các công cụ xây dựng khác?

Trước khi có bản phát hành Alpha đầu tiên, Bazel chưa có sẵn bên ngoài, vì vậy các dự án nguồn mở như Chromium và Android không thể sử dụng công cụ này. Ngoài ra, việc thiếu hỗ trợ Windows ban đầu cũng là vấn đề đối với việc xây dựng các ứng dụng Windows, chẳng hạn như Chrome. Do dự án này đã hoàn thiện và đi vào hoạt động ổn định hơn, nên Dự án nguồn mở Android đang trong quá trình chuyển sang Bazel.

Bạn phát âm “Bazel” như thế nào?

Giống như “basil” (thảo mộc) trong tiếng Anh Mỹ: “BAY-zel”. Từ này vần với “hazel”. IPA: /ˈbeɪzˌ0l/