Khả năng tương thích quy tắc

Báo cáo sự cố Xem nguồn

Các quy tắc Bazel Starlark có thể phá vỡ khả năng tương thích với các bản phát hành LTS của Bazel trong 2 trường hợp sau:

  1. Quy tắc này phá vỡ khả năng tương thích với các bản phát hành LTS trong tương lai vì một tính năng mà quy tắc này phụ thuộc đã bị xoá khỏi Bazel tại HEAD.
  2. Quy tắc này phá vỡ khả năng tương thích với các bản phát hành LTS hiện tại hoặc trước đó vì một tính năng mà quy tắc này phụ thuộc chỉ có trong các bản phát hành Bazel LTS mới hơn.

Trong khi đó, chính quy tắc đó cũng có thể gửi các thay đổi không tương thích cho người dùng. Khi kết hợp với các thay đổi có thể gây lỗi trong Bazel, việc nâng cấp phiên bản quy tắc và phiên bản Bazel thường có thể khiến người dùng Bazel cảm thấy thất vọng. Trang này trình bày cách tác giả quy tắc cần duy trì khả năng tương thích quy tắc với Bazel để giúp người dùng nâng cấp Bazel và các quy tắc dễ dàng hơn.

Quá trình di chuyển có thể quản lý

Mặc dù rõ ràng là không thể đảm bảo khả năng tương thích giữa mọi phiên bản Bazel và mọi phiên bản của quy tắc, nhưng mục tiêu của chúng tôi là đảm bảo rằng quá trình di chuyển vẫn có thể quản lý được cho người dùng Bazel. Quy trình di chuyển có thể quản lý được định nghĩa là quy trình trong đó người dùng không buộc phải nâng cấp đồng thời phiên bản lớn của quy tắc và phiên bản lớn của Bazel, do đó cho phép người dùng xử lý các thay đổi không tương thích từ một nguồn tại một thời điểm.

Ví dụ: với ma trận tương thích sau đây:

  • Việc di chuyển từ rules_foo 1.x + Bazel 4.x sang rules_foo 2.x + Bazel 5.x không được coi là có thể quản lý được, vì người dùng cần nâng cấp phiên bản lớn của rules_foo và Bazel cùng một lúc.
  • Việc di chuyển từ rules_foo 2.x + Bazel 5.x sang rules_foo 3.x + Bazel 6.x được coi là có thể quản lý được, vì trước tiên người dùng có thể nâng cấp rules_foo từ 2.x lên 3.x mà không cần thay đổi phiên bản Bazel lớn, sau đó nâng cấp Bazel từ 5.x lên 6.x.
quy tắc_foo 1.x quy tắc_foo 2.x quy tắc_foo 3.x HEAD
Bazel 4.x
Bazel 5.x
Bazel 6.x
HEAD

❌: Không có phiên bản của phiên bản quy tắc chính nào tương thích với bản phát hành Bazel LTS.

✅: Ít nhất một phiên bản của quy tắc tương thích với phiên bản mới nhất của bản phát hành Bazel LTS.

Các phương pháp hay nhất

Là tác giả của Bazel, bạn có thể đảm bảo quy trình di chuyển dễ quản lý cho người dùng bằng cách làm theo các phương pháp hay nhất sau đây:

  1. Quy tắc này phải tuân theo Tạo phiên bản ngữ nghĩa: các phiên bản nhỏ của cùng một phiên bản chính có khả năng tương thích ngược.
  2. Quy tắc tại HEAD phải tương thích với bản phát hành Bazel LTS mới nhất.
  3. Quy tắc tại HEAD phải tương thích với Bazel tại HEAD. Để đạt được điều này, bạn có thể
    • Thiết lập quy trình kiểm tra CI của riêng bạn với Bazel tại HEAD
    • Thêm dự án của bạn vào kiểm thử hạ nguồn Bazel; nhóm Bazel sẽ gửi vấn đề đến dự án của bạn nếu những thay đổi có thể gây lỗi trong Bazel ảnh hưởng đến dự án. Ngoài ra, bạn phải tuân thủ các chính sách về dự án hạ nguồn để giải quyết kịp thời vấn đề.
  4. Phiên bản lớn mới nhất của quy tắc này phải tương thích với bản phát hành mới nhất của Bazel LTS.
  5. Phiên bản lớn mới của quy tắc phải tương thích với bản phát hành Bazel LTS gần đây nhất mà phiên bản lớn trước đó của quy tắc hỗ trợ.

Đạt được 2. và 3. là nhiệm vụ quan trọng nhất vì nó cho phép đạt được 4. và 5. một cách tự nhiên.

Để dễ dàng duy trì khả năng tương thích với cả Bazel tại HEAD và bản phát hành mới nhất của Bazel LTS, tác giả quy tắc có thể:

  • Hãy yêu cầu điều chỉnh các tính năng tương thích ngược cho bản phát hành LTS mới nhất, hãy xem quy trình phát hành để biết thêm thông tin chi tiết.
  • Sử dụng bazel_features để phát hiện tính năng của Bazel.

Nhìn chung, với các phương pháp đề xuất, các quy tắc sẽ có thể di chuyển cho các thay đổi không tương thích với Bazel và tận dụng các tính năng mới của Bazel tại HEAD mà không làm giảm khả năng tương thích với bản phát hành Bazel LTS mới nhất.