Hermeticidad

Informar un problema Ver fuente . Por la noche · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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 y otro software instalado en la máquina anfitrión local o remota. Dependen de versiones específicas de herramientas de compilación (como compiladores) y dependencias (como los compiladores) bibliotecas. Esto hace que el proceso de compilación sea autónomo, ya que no depende de externos al entorno de compilación.

Los dos aspectos importantes de 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 similitud de los de datos. 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 utilizan este hash para identificar 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 que la acción se almacene en caché. se volverá a ejecutar, a menos que las entradas cambien.
  • 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 hash las entradas que se buscarán en la caché.
  • Varias compilaciones: Puedes compilar varias compilaciones herméticas a partir de la misma. 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.

Identificar la no hermética

Si te estás preparando para cambiar a Bazel, la migración es más fácil si mejoras tus compilaciones existentes hermeticidad por adelantado. Algunas fuentes comunes de no hermeticidad en compilaciones son las siguientes:

  • Procesamiento arbitrario en .mk archivos
  • 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, valores absolutos rutas de acceso, compiladores C++ del sistema para la configuración automática de reglas C++ nativas)
  • Escribir en el árbol de fuentes 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. Entonces, si intentas crear el destino B, fallan.

Soluciona problemas de compilaciones no herméticas

Comenzando por la ejecución local, los problemas que afectan los aciertos de caché local revelan acciones no herméticas.

  • Asegúrate de que las compilaciones secuenciales nulas sean nulas. Si ejecutas make y obtienes una compilación correcta, volver a ejecutar la compilación no debería recompilar ningún objetivo. 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 clientes 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 solo contenga árbol de fuentes de pago y 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.
  • Habilitar la zona de pruebas estricta a nivel por acción, ya que las acciones en una compilación pueden ser con 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 del espacio de trabajo de Bazel agregar la bandera --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 han tenido éxito mediante con Bazel, mira estas charlas de BazelCon: