Hermeticidad

Informa un problema Ver código fuente

En esta página, se describen la hermetismo, 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 la misma configuración de producto y código fuente de entrada, un sistema de compilación hermético siempre muestra la misma salida mediante el aislamiento de 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 ningún otro software instalado en la máquina anfitrión local o remota. Dependen de versiones específicas de las herramientas de compilación, como compiladores, y de 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 hermética 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 lo usan dentro de árboles de archivos administrados. Esto crea aislamiento entre la máquina host y el usuario local, incluidas las versiones de idiomas instaladas.
  • Identidad de la fuente: Los sistemas de compilación herméticos intentan garantizar que las entradas sean iguales. 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 cambios en la entrada de la compilación.

Beneficios

Los beneficios principales 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 se vuelva a ejecutar, a menos que cambien las entradas.
  • Ejecución paralela: Para una entrada y salida determinadas, el sistema de compilación puede construir un grafo de todas las acciones a fin de calcular una ejecución eficiente y paralela. El sistema de compilación carga las reglas y calcula un grafo de acción y entradas de hash para buscar en la caché.
  • Varias compilaciones: Puedes compilar varias compilaciones herméticas en la misma máquina; cada compilación usa herramientas y versiones diferentes.
  • Reproducibilidad: Las compilaciones herméticas son buenas para solucionar problemas porque conoces las condiciones exactas que produjeron la compilación.

Identificación de no hermética

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. Estas son algunas fuentes comunes de elementos no herméticos en las compilaciones:

  • Procesamiento arbitrario en archivos .mk
  • Acciones o herramientas que crean archivos de manera no determinista, por lo general, ID de compilación o marcas de tiempo
  • Objetos binarios del sistema que difieren entre los hosts (como objetos binarios /usr/bin, rutas absolutas, 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 se use el mismo árbol de origen para otro destino. La primera compilación escribe en el árbol de fuentes y corrige el árbol de fuentes para el destino A. Luego, el intento de compilar el destino B puede fallar.

Solución de 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 las compilaciones secuenciales sean nulas: Si ejecutas make y obtienes una compilación exitosa, volver a ejecutar la compilación no debe volver a compilar ningún destino. Si ejecutas cada paso de la compilación dos veces o en sistemas diferentes, comparas un hash del contenido del archivo y obtienes resultados diferentes, la compilación no será reproducible.
  • Ejecuta los pasos para depurar los aciertos de caché local desde una variedad de máquinas cliente potenciales a fin de asegurarte de detectar los casos de entorno cliente que se filtren en las acciones.
  • Ejecuta una compilación dentro de un contenedor de Docker que no contenga más que el árbol de origen verificado y la lista explícita de herramientas de host. Las fallas de compilación y los mensajes de error detectarán las dependencias implícitas del sistema.
  • Descubre y soluciona problemas de hermetismo mediante reglas de ejecución remota.
  • Habilita la 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 del lugar de trabajo permiten a los desarrolladores agregar dependencias a los lugares de trabajo externos, pero son lo suficientemente abundantes para permitir que se lleve a cabo el 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 agregando la marca --experimental_workspace_rules_log_file=PATH al 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: