Hermeticidad

En esta página, se aborda la hermeticidad, los beneficios de usar compilaciones herméticas y 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 las herramientas de compilación, como los compiladores, y de las dependencias, como las 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 las herramientas y administran su almacenamiento y uso dentro de los árboles de archivos administrados. Esto crea aislamiento entre la máquina host y el usuario local, incluidas las versiones instaladas de los lenguajes.
  • Identidad de origen: 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 ejecutar la acción, a menos que cambien las entradas.
  • Ejecución paralela: Para una entrada y salida determinadas, el sistema de compilación puede construir un gráfico de todas las acciones para calcular la ejecución eficiente y paralela. El sistema de compilación carga las reglas y calcula un gráfico de acciones y entradas hash para buscar en la caché.
  • Compilaciones múltiples: Puedes compilar varias compilaciones herméticas en la misma máquina, y cada compilación usa diferentes herramientas y versiones.
  • Reproducibilidad: Las compilaciones herméticas son útiles para solucionar problemas porque conoces las condiciones exactas que produjeron la compilación.

Identifica la falta de hermeticidad

Si te preparas 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 falta de hermeticidad en las compilaciones son las siguientes:

  • Procesamiento arbitrario en archivos .mk
  • Acciones o herramientas que crean archivos de forma no determinista, que suelen incluir IDs de compilación o marcas de tiempo
  • Objetos binarios del sistema que difieren entre hosts (como objetos binarios /usr/bin, rutas absolutas, compiladores de C++ del sistema para la configuración automática de reglas de 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 de origen y lo corrige para el destino A. Luego, intentar compilar el destino B puede fallar.

Soluciona problemas de compilaciones no herméticas

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

  • Asegúrate de que no haya compilaciones secuenciales nulas: Si ejecutas make y obtienes una compilación correcta, 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 obtén resultados diferentes, la compilación no es reproducible.
  • Ejecuta pasos para depurar los aciertos de caché local desde una variedad de máquinas cliente potenciales 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 del host. Las interrupciones de compilación y los mensajes de error detectarán dependencias implícitas del sistema.
  • Descubre y corrige problemas de hermeticidad con reglas de ejecución remota.
  • Habilita el aislamiento estricto a nivel de 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 a los desarrolladores agregar dependencias a espacios de trabajo externos, pero son lo suficientemente completas 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 del 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 las compilaciones herméticas con Bazel, consulta estas charlas de BazelCon: