규칙 호환성

문제 신고 소스 보기

Bazel Starlark 규칙은 다음 두 시나리오에서 Bazel LTS 출시 버전과의 호환성을 중단할 수 있습니다.

  1. 이 규칙은 종속되는 기능이 HEAD의 Bazel에서 삭제되므로 향후 LTS 버전과의 호환성을 중단합니다.
  2. 규칙이 현재 또는 이전 LTS 출시 버전과의 호환성을 손상시키는 이유는 이 기능이 종속된 기능을 최신 Bazel LTS 출시 버전에서만 사용할 수 있기 때문입니다.

한편 규칙 자체도 사용자에게 호환되지 않는 변경사항을 전송할 수 있습니다. Bazel의 브레이킹 체인지와 결합할 때 규칙 버전과 Bazel 버전을 업그레이드하는 것은 종종 Bazel 사용자에게 불만의 원인이 될 수 있습니다. 이 페이지에서는 사용자가 Bazel 및 규칙을 더 쉽게 업그레이드할 수 있도록 규칙 작성자가 Bazel과의 규칙 호환성을 유지해야 하는 방법을 설명합니다.

관리 가능한 마이그레이션 프로세스

Bazel의 모든 버전과 규칙의 버전 간의 호환성을 보장하는 것은 불가능하지만 Google은 Bazel 사용자가 마이그레이션 프로세스를 관리할 수 있도록 하는 것을 목표로 합니다. 관리 가능한 마이그레이션 프로세스는 사용자가 규칙의 메이저 버전과 Bazel의 메이저 버전을 동시에 업그레이드하지 않아도 되는 프로세스입니다. 이 과정을 통해 사용자는 호환되지 않는 변경사항을 한 번에 한 소스에서 처리할 수 있습니다.

예를 들어 다음 호환성 매트릭스를 사용하세요.

  • rules_foo 1.x + Bazel 4.x에서 rules_foo 2.x + Bazel 5.x로 마이그레이션하는 것은 사용자가 규칙_foo와 Bazel의 동시 버전을 동시에 업그레이드해야 하기 때문에 관리 가능한 것으로 간주되지 않습니다.
  • rules_foo 2.x + Bazel 5.x에서 rules_foo 3.x + Bazel 6.x로 마이그레이션하는 것은 관리 가능한 것으로 간주됩니다. 사용자가 먼저 주요 Bazel 버전을 변경하지 않고 rules_foo를 2.x에서 3.x로 업그레이드한 다음 Bazel을 5.x에서 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

❌: Bazel LTS 출시 버전과 호환되는 주 규칙 버전이 없습니다.

✅: 하나 이상의 규칙 버전이 최신 버전의 Bazel LTS 출시 버전과 호환됩니다.

권장사항

Bazel 규칙 작성자는 다음 권장사항에 따라 관리 가능한 마이그레이션 프로세스를 사용자에게 보장할 수 있습니다.

  1. 규칙은 체계적인 버전 관리를 따라야 합니다. 동일한 주 버전의 부 버전은 이전 버전과 호환됩니다.
  2. HEAD의 규칙은 최신 Bazel LTS 출시 버전과 호환되어야 합니다.
  3. HEAD의 규칙은 HEAD의 Bazel과 호환되어야 합니다. 이를 위해 다음을 할 수 있습니다.
    • HEAD에서 Bazel을 사용하여 자체 CI 테스트 설정
    • Bazel 다운스트림 테스트에 프로젝트를 추가합니다. Bazel팀은 브레이킹 체인지가 프로젝트에 영향을 미치는 경우 프로젝트에 문제를 보고하고 다운스트림 프로젝트 정책을 따라 문제를 신속하게 해결해야 합니다.
  4. 최신 버전의 주 버전이 최신 Bazel LTS 출시 버전과 호환되어야 합니다.
  5. 규칙의 새로운 메이저 버전은 이전 메이저 버전에서 지원되는 마지막 Bazel LTS 출시 버전과 호환되어야 합니다.

2와 3을 달성하는 것은 4와 5를 달성할 수 있으므로 가장 중요한 작업입니다. 있습니다.

HEAD의 Bazel과 최신 Bazel LTS 출시 버전 간의 호환성을 더 쉽게 유지하기 위해 규칙 작성자는 다음을 수행할 수 있습니다.

  • 이전 버전과 호환되는 기능을 최신 LTS 출시 버전으로 백 포팅하도록 요청합니다. 자세한 내용은 출시 프로세스를 참고하세요.
  • bazel_features를 사용하여 Bazel 기능 감지

일반적으로 권장 접근 방식을 사용하면 규칙을 최신 Bazel LTS 버전과의 호환성 저하 없이 Bazel 비호환 변경사항에 맞게 이전하고 새 Bazel 기능을 사용할 수 있어야 합니다.