Las reglas de Starlark de Bazel pueden romper la compatibilidad con las versiones LTS de Bazel en las siguientes dos situaciones:
- La regla rompe la compatibilidad con las versiones LTS futuras porque se quita de Bazel en HEAD una función de la que depende.
- 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 drásticos en Bazel, actualizar la versión de la regla y la versión de 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 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 regla principal es compatible con la versión 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 autores de reglas de Bazel, puedes garantizar un proceso de migración manejable para los usuarios si sigues estas prácticas recomendadas:
- La regla debe seguir el control de versiones semántico: las versiones secundarias de la misma versión principal son retrocompatibles.
- La regla en HEAD debe ser compatible con la versión LTS más reciente de Bazel.
- La regla en HEAD debe ser compatible con Bazel en HEAD. Para lograrlo, puedes hacer lo siguiente:
- Configura tus propias pruebas de CI con Bazel en HEAD
- Agrega tu proyecto a las pruebas downstream de Bazel. El equipo de Bazel envía problemas a 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.
- La versión principal más reciente de la regla debe ser compatible con la versión más reciente de la asistencia a largo plazo de Bazel.
- 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. de forma natural.
Para facilitar la compatibilidad con Bazel en HEAD y la versión LTS más reciente de Bazel, 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.