En esta página, se explica la hermeticidad, los beneficios de usar compilaciones herméticas y las estrategias para identificar el comportamiento no hermético en tus compilaciones.
Descripción general
Cuando se proporciona el mismo código fuente de entrada y la misma configuración del producto, un sistema de compilación hermético siempre muestra el mismo resultado, ya que aísla la compilación de los cambios en el sistema host.
Para aislar la compilación, las compilaciones herméticas no son sensibles a las bibliotecas ni a otro software instalado en la máquina host local o remota. Dependen de versiones específicas de herramientas de compilación, como compiladores, y dependencias, como bibliotecas. Esto hace que el proceso de compilación sea independiente, ya que no depende de servicios externos al entorno de compilación.
Los dos aspectos importantes de la hermeticidad son los siguientes:
- Aislamiento: Los sistemas de compilación herméticos tratan las herramientas como código fuente. Descargan copias de herramientas y administran su almacenamiento y uso dentro de árboles de archivos administrados. Esto crea aislamiento entre la máquina host y el usuario local, incluidas las versiones instaladas de los idiomas.
- Identidad de la fuente: Los sistemas de compilación herméticos intentan garantizar la igualdad de las entradas. Los repositorios de código, como Git, identifican conjuntos de mutaciones de código con un código hash único. Los sistemas de compilación herméticos usan este hash para identificar los cambios en la entrada de la compilación.
Beneficios
Los principales beneficios de las compilaciones herméticas son los siguientes:
- Velocidad: El resultado de una acción se puede almacenar en caché, y no es necesario volver a ejecutarla, a menos que cambien las entradas.
- Ejecución en paralelo: Para una entrada y una salida determinadas, el sistema de compilación puede construir un gráfico de todas las acciones para calcular una ejecución eficiente y en paralelo. El sistema de compilación carga las reglas y calcula un gráfico de acciones y entradas de hash para buscar en la caché.
- Varias compilaciones: Puedes compilar varias compilaciones herméticas en la misma máquina, cada una con diferentes herramientas y versiones.
- Reproducibilidad: Las compilaciones herméticas son buenas para solucionar problemas, ya que conoces las condiciones exactas que las generaron.
Cómo identificar la no hermeticidad
Si te estás preparando para cambiar a Bazel, la migración es más fácil si mejoras la hermeticidad de tus compilaciones existentes con anticipación. Estas son algunas fuentes comunes de no hermeticidad en las compilaciones:
- Procesamiento arbitrario en archivos
.mk
- Acciones o herramientas que crean archivos de forma no determinista, por lo general, con IDs de compilación o marcas de tiempo
- Objetos binarios del sistema que difieren entre hosts (como objetos binarios
/usr/bin
, rutas de acceso absolutas, compiladores C++ del sistema para la autoconfiguración de reglas C++ nativas) - Escritura en el árbol de origen durante la compilación Esto evita que se use el mismo árbol de origen para otro destino. La primera compilación escribe en el árbol fuente y corrige el árbol fuente para el destino A. Luego, es posible que falle la compilación del destino B.
Soluciona problemas de compilaciones no herméticas
A partir de la ejecución local, los problemas que afectan los hits de la caché local revelan acciones no herméticas.
- Asegúrate de que las compilaciones secuenciales sean nulas: Si ejecutas
make
y obtienes una compilación correcta, volver a ejecutarla no debería volver a compilar ningún destino. Si ejecutas cada paso de compilación dos veces o en diferentes sistemas, comparas un hash del contenido del archivo y obtienes resultados que difieren, la compilación no se puede reproducir. - Ejecuta pasos para depurar los hits de caché local desde una variedad de posibles máquinas cliente para asegurarte de detectar cualquier caso de filtración del entorno del cliente en las acciones.
- Ejecuta una compilación dentro de un contenedor de Docker que no contenga nada más que el árbol de origen extraído y la lista explícita de herramientas de host. Las interrupciones de compilación y los mensajes de error detectarán las dependencias implícitas del sistema.
- Descubre y corrige los problemas de hermeticidad con las reglas de ejecución remota.
- Habilita una zona de pruebas estricta a nivel de cada acción, ya que las acciones en una compilación pueden tener estado y afectar la compilación o el resultado.
- Las reglas de Workspace permiten a los desarrolladores agregar dependencias a espacios de trabajo externos, pero son lo suficientemente enriquecidas como para permitir que se realice un procesamiento arbitrario en el proceso. Para obtener un registro de algunas acciones potencialmente no herméticas en las reglas de espacio de trabajo de Bazel, agrega la marca
--experimental_workspace_rules_log_file=PATH
a tu comando de Bazel.
Hermeticidad con Bazel
Para obtener más información sobre cómo otros proyectos tuvieron éxito con compilaciones herméticas con Bazel, consulta estas charlas de BazelCon:
- Cómo compilar sistemas en tiempo real con Bazel (SpaceX)
- Ejecución y almacenamiento en caché remotos de Bazel (Uber y TwoSigma)
- Compilaciones más rápidas con la ejecución y la caché remotas
- Fusing Bazel: Compilación incremental más rápida
- Ejecución remota frente a ejecución local
- Mejora la usabilidad del almacenamiento en caché remoto (IBM)
- Cómo compilar vehículos autónomos con Bazel (BMW)
- Cómo compilar vehículos autónomos con Bazel + Preguntas y respuestas (GM Cruise)