Compatibilidad de las reglas

Informar un problema Ver fuente

Las reglas de Bazel Starlark pueden romper la compatibilidad con las versiones de Bazel LTS en las siguientes 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 no es compatible con las versiones de LTS actuales o anteriores porque una función de la que depende solo está disponible en versiones de Bazel LTS 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 las versiones de reglas y de Bazel puede ser motivo de frustración para los usuarios de Bazel. En esta página, se explica cómo los creadores de reglas deben mantener la compatibilidad de reglas con Bazel para que sea más fácil para los usuarios actualizar Bazel y las reglas.

Proceso de migración administrable

Si bien es evidente que no es factible garantizar la compatibilidad entre todas las versiones de Bazel y todas las versiones 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 administrable 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 permite a los usuarios 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 administrable, ya que los usuarios deben actualizar la versión principal 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 administrable, ya que los usuarios pueden actualizar primero rules_foo de la versión 2.x a la 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 LTS de Bazel.

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

Prácticas recomendadas

Como autores de 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 el control de versiones semántico: las versiones secundarias de la misma versión principal son retrocompatibles.
  2. La regla en el encabezado debe ser compatible con la versión más reciente de Bazel LTS.
  3. La regla del encabezado debe ser compatible con Bazel en el encabezado. Para lograrlo, puedes hacer lo siguiente:
    • Configura tus propias pruebas de CI con Bazel en el encabezado
    • Agrega tu proyecto a las pruebas descendentes de Bazel. El equipo de Bazel archivará los problemas en tu proyecto si los cambios rotundos en Bazel afectan tu proyecto, y debes seguir nuestras políticas del proyecto descendentes para abordar los problemas de manera 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 versión principal nueva de la regla debe ser compatible con la última versión de Bazel LTS compatible con la versión principal anterior de la regla.

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

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

  • Solicita que las funciones retrocompatibles se transfieran a 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 características de Bazel.

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