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

Báo cáo vấn đề Xem nguồn Nightly .

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 Bazel LTS trong 2 trường hợp sau:

  1. Quy tắc này sẽ 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 vào sẽ bị xoá khỏi Bazel tại HEAD.
  2. Quy tắc này sẽ 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 cũ hơn 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 LTS mới hơn của Bazel.

Trong khi đó, bản thân quy tắc này 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 những 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ể gây khó chịu cho người dùng Bazel. Trang này trình bày cách tác giả các quy tắc nên duy trì khả năng tương thích của quy tắc với Bazel để giúp người dùng dễ dàng nâng cấp Bazel và các quy tắc.

Quy 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 người dùng Bazel vẫn có thể quản lý được quy trình di chuyển 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 bắt buộc phải nâng cấp đồng thời cả phiên bản lớn của quy tắc và phiên bản lớn của Bazel, nhờ đó 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:

  • Bạn không thể dễ dàng quản lý việc di chuyển từ rules_foo 1.x + Bazel 4.x sang rules_foo 2.x + Bazel 5.x vì người dùng cần phải 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à dễ quản lý 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 chính, sau đó nâng cấp Bazel từ 5.x lên 6.x.
rules_foo 1.x Rules_foo 2.x Rules_foo 3.x HEAD
Bazel 4.x
Bazel 5.x
Bazel 6.x
HEAD

❌: Không có phiên bản nào của phiên bản quy tắc chính 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

Như các tác giả quy tắc của Bazel, bạn có thể đảm bảo một 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 thủ 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 LTS của Bazel mới nhất.
  3. Quy tắc tại HEAD phải tương thích với Bazel tại HEAD. Để làm được điều này, bạn có thể
    • Thiết lập hoạt động kiểm thử CI của riêng bạn với Bazel tại HEAD
    • Thêm dự án của bạn vào quy trình kiểm thử Bazel hạ nguồn; nhóm Bazel sẽ báo cáo vấn đề cho dự án nếu các thay đổi có thể gây lỗi trong Bazel ảnh hưởng đến dự án của bạn. Đồng thời, bạn phải tuân thủ chính sách về dự án truyền xuống để giải quyết vấn đề kịp thời.
  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 bazel LTS mới nhất.
  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 được phiên bản lớn trước đó của quy tắc hỗ trợ.

Việc đạ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 ở giao diện HEAD và bản phát hành Bazel LTS mới nhất, các tác giả quy tắc có thể:

  • Yêu cầu các tính năng tương thích ngược được chuyển về 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 Bazel.

Nhìn chung, với các phương pháp được đề xuất, các quy tắc có thể di chuyển đối với những thay đổi không tương thích với Bazel, đồng thời sử dụng các tính năng mới của Bazel ở chế độ 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.