Compatibilidad de las reglas

Informa un problema Ver código fuente

Las reglas de Bazel Starlark pueden interrumpir la compatibilidad con las versiones LTS de Bazel en las siguientes dos situaciones:

  1. La regla interrumpe la compatibilidad con futuras versiones de LTS porque una función de la que depende se quita de Bazel en HEAD.
  2. La regla interrumpe la compatibilidad con las versiones LTS actuales o anteriores porque una función de la que depende solo está disponible en versiones más recientes de Bazel LTS.

Mientras tanto, la regla también puede enviar cambios incompatibles para sus usuarios. Cuando se combina con los cambios rotundos en Bazel, la actualización de las versiones de las reglas y Bazel a menudo puede ser una fuente de frustración para los usuarios de Bazel. En esta página, se explica cómo los autores de reglas deben mantener la compatibilidad de reglas con Bazel a fin de facilitar la actualización de Bazel y las reglas para los usuarios.

Proceso de migración administrable

Si bien es obvio que no es posible garantizar la compatibilidad entre cada versión de Bazel y cada versión de la regla, nuestro objetivo es garantizar que el proceso de migración siga siendo manejable para los usuarios de Bazel. Un proceso de migración manejable se define como un proceso en el que los usuarios no se ven obligados a actualizar la versión principal de la regla y la versión principal de Bazel al mismo tiempo, lo que les permite manejar cambios incompatibles de una fuente a la vez.

Por ejemplo, con la siguiente matriz de compatibilidad:

  • La migración de rules_foo 1.x + Bazel 4.x a rules_foo 2.x + Bazel 5.x no se considera manejable, ya que los usuarios deben actualizar las versiones principales de rules_foo y Bazel al mismo tiempo.
  • La migración de rules_foo 2.x + Bazel 5.x a rules_foo 3.x + Bazel 6.x se considera manejable, ya que los usuarios primero pueden actualizar reglas_foo de 2.x a 3.x sin cambiar la versión principal de Bazel y, luego, actualizar Bazel de 5.x a 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

❌: Ninguna versión de la versión de la regla principal es compatible con la versión de LTS de Bazel.

✅: Al menos una versión de la regla es compatible con la versión más reciente de la versión LTS de Bazel.

Prácticas recomendadas

Como autor de las reglas de Bazel, puedes garantizar un proceso de migración administrable para los usuarios si sigues estas prácticas recomendadas:

  1. La regla debe seguir al Control de versiones semántico: las versiones secundarias de la misma versión principal son retrocompatibles.
  2. La regla en HEAD debe ser compatible con la última versión de LTS de Bazel.
  3. La regla de HEAD debe ser compatible con Bazel en HEAD. Para lograrlo, puedes
    • Configura tus propias pruebas de CI con Bazel en HEAD
    • Agrega tu proyecto a las pruebas de Bazel downstream. El equipo de Bazel presenta problemas en tu proyecto si los cambios rotundos de Bazel afectan el proyecto, y debes seguir nuestras políticas de proyectos descendentes para abordar los problemas de forma oportuna.
  4. La versión principal más reciente de la regla debe ser compatible con la versión LTS más reciente de Bazel.
  5. Una versión principal nueva de la regla debe ser compatible con la última versión de LTS de Bazel compatible con la versión principal anterior de la regla.

Lograr 2 y 3 es la tarea más importante, ya que permite alcanzar 4 y 5. naturalmente.

Para que sea más fácil mantener la compatibilidad con Bazel en HEAD y la versión más reciente de Bazel LTS, los autores de reglas pueden hacer lo siguiente:

  • Solicita que las funciones compatibles con versiones anteriores sean compatibles con la última versión de LTS, consulta el proceso de lanzamiento para obtener más detalles.
  • Usa bazel_features para realizar la detección de funciones de Bazel.

En general, con los enfoques recomendados, las reglas deberían poder migrar para cambios incompatibles con Bazel y usar funciones nuevas de Bazel en HEAD sin perder compatibilidad con la versión más reciente de Bazel LTS.