Esta página trata sobre la hermeticidad, las ventajas de usar construcciones herméticas y estrategias para identificar comportamientos no herméticos en tus compilaciones.
Descripción general
Cuando se les proporciona el mismo código fuente de entrada y la misma configuración de producto, El sistema de compilación siempre devuelve el mismo resultado al aislar la compilación de los cambios. al 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. Ellas descargar copias de las herramientas y administrar su almacenamiento y usarlas dentro de archivos administrados árboles. Esto crea aislamiento entre la máquina anfitrión 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 paralela: Para entradas y salidas determinadas, el sistema de compilación puede construir un gráfico de todas las acciones para calcular la eficiencia y la ejecución. 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 útiles para solucionar problemas porque conocer las condiciones exactas que produjo la compilación.
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. Algunas fuentes comunes de no hermeticidad en compilaciones son las siguientes:
- Procesamiento arbitrario en archivos
.mk
- Acciones o herramientas que crean archivos de forma no determinista y que, por lo general, involucran 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 la misma fuente para evitar que se use para otro objetivo. La primera compilación escribe en la fuente de la secuencia de comandos para corregir el árbol de fuentes del objetivo 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 compilación dos veces o en sistemas diferentes, compara un hash del contenido del archivo y obtener resultados diferentes, la compilación no es reproducible. - Ejecuta los pasos para depura los aciertos de caché local de una variedad de máquinas cliente potenciales para detectar cualquier casos en los que el entorno del cliente se filtra en las acciones.
- Ejecuta una compilación dentro de un contenedor de Docker que no contenga nada más que el árbol de origen revisado y la lista explícita de herramientas de host. Genera fallas y detectarán las dependencias implícitas del sistema.
- Descubrir y solucionar problemas de hermeticidad con 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.
- Reglas de Workspace
permiten a los desarrolladores agregar dependencias a espacios de trabajo externos, pero
lo suficientemente enriquecida como para permitir que se produzca procesamiento arbitrario en el proceso. Puedes obtener un registro de algunas acciones potencialmente no herméticas en las reglas de espacio de trabajo de Bazel si agregas 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:
- Building Real-time Systems with 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 construir vehículos autónomos con Bazel (BMW)
- Cómo compilar vehículos autónomos con Bazel + Preguntas y respuestas (GM Cruise)