Compatibilidad de las reglas

Informar un problema Ver fuente Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Las reglas de Bazel Starlark pueden romper la compatibilidad con las versiones LTS de Bazel en el con estas dos situaciones:

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

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

Proceso de migración administrable

Si bien, obviamente, no es factible 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 de forma simultánea, lo que les permite controlar los cambios incompatibles de una fuente a la vez.

Por ejemplo, con la siguiente matriz de compatibilidad:

  • No se considera que la migración de rules_foo 1.x + Bazel 4.x a rules_foo 2.x + Bazel 5.x sea manejable, ya que los usuarios deben actualizar la versión principal de rules_foo y Bazel al mismo tiempo.
  • Se considera que la migración de rules_foo 2.x + Bazel 5.x a rules_foo 3.x + Bazel 6.x es manejable, ya que los usuarios primero pueden actualizar rules_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 CABEZA
Bazel 4.x
Bazel 5.x
Bazel 6.x
CABEZA

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

✅: 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 autores de reglas de Bazel, puedes garantizar un proceso de migración manejable para los usuarios si sigues estas prácticas recomendadas:

  1. La regla debe seguir la estructura de semántica Control de versiones: versiones secundarias del mismo versión principal son retrocompatibles.
  2. La regla en HEAD debe ser compatible con la versión LTS más reciente de Bazel.
  3. La regla del encabezado debe ser compatible con Bazel en el encabezado. Para lograrlo, puedes
    • Configura tus propias pruebas de CI con Bazel en HEAD
    • Agrega tu proyecto a las pruebas downstream de Bazel. El equipo de Bazel registra problemas en tu proyecto si los cambios que generan errores en Bazel lo afectan, y debes seguir nuestras políticas de proyectos downstream 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 más reciente de Bazel LTS.
  5. Una nueva versión principal de la regla debe ser compatible con la última versión LTS de Bazel que admite la versión principal anterior de la regla.

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

Para que sea más fácil mantener la compatibilidad con Bazel en el encabezado y con las versiones más recientes Versión de Bazel LTS; los autores de reglas pueden hacer lo siguiente:

  • Solicita que las funciones retrocompatibles se lleven a la versión LTS más reciente. Consulta el proceso de lanzamiento para obtener más detalles.
  • Usa bazel_features para realizar la detección de atributos de Bazel.

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