Hermeticidad

Informar un problema Ver código fuente Nocturno · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

En esta página, se abordan 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 le proporciona el mismo código fuente de entrada y la misma configuración del producto, un sistema de compilación hermético siempre devuelve 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 autónomo, 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 uniformidad 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: La salida de una acción se puede almacenar en caché, y no es necesario volver a ejecutar la acción a menos que cambien las entradas.
  • Ejecución paralela: 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 paralela. 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, y cada una de ellas usará diferentes herramientas y versiones.
  • Reproducibilidad: Las compilaciones herméticas son útiles para solucionar problemas porque conoces las condiciones exactas que produjeron la compilación.

Identificación de la no hermeticidad

Si te estás preparando para cambiar a Bazel, la migración será más sencilla si mejoras la hermeticidad de tus compilaciones existentes con anticipación. Algunas fuentes comunes de no hermeticidad en las compilaciones son las siguientes:

  • Procesamiento arbitrario en archivos .mk
  • Acciones o herramientas que crean archivos de forma no determinística, lo que suele implicar IDs de compilación o marcas de tiempo
  • Binarios del sistema que difieren entre los hosts (como los binarios de /usr/bin, las rutas absolutas y los compiladores de C++ del sistema para la autoconfiguración de reglas nativas de C++)
  • Escribir 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 de origen y corrige el árbol de origen para el destino A. Por lo tanto, intentar compilar el destino B puede fallar.

Soluciona problemas de compilaciones no herméticas

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

  • Asegúrate de que no haya compilaciones secuenciales nulas: Si ejecutas make y obtienes una compilación exitosa, volver a ejecutar la compilación no debería volver a compilar ningún destino. Si ejecutas cada paso de compilación dos veces o en sistemas diferentes, compara un hash del contenido del archivo y obtienes resultados diferentes, la compilación no es reproducible.
  • Ejecuta pasos para depurar los aciertos de caché locales 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 fuente extraído y la lista explícita de herramientas del host. Las interrupciones de compilación y los mensajes de error detectarán las dependencias implícitas del sistema.
  • Descubre y corrige problemas de hermeticidad con las reglas de ejecución remota.
  • Habilita el aislamiento estricto 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 del espacio de trabajo permiten que los desarrolladores agreguen dependencias a espacios de trabajo externos, pero son lo suficientemente completas como para permitir que se produzca un 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 agregando 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 lograron el éxito con compilaciones herméticas con Bazel, consulta estas charlas de BazelCon: