Hermeticidad

Informar un problema Ver fuente

En esta página, se describe la hermeticidad, los beneficios de usar compilaciones herméticas y las estrategias para identificar comportamientos no herméticos en tus compilaciones.

Descripción general

Cuando se le proporciona el mismo código fuente de entrada y la misma configuración de producto, un sistema de compilación hermético siempre muestra el mismo resultado 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 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 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 hermeticidad son los siguientes:

  • Aislamiento: Los sistemas de compilación herméticos tratan las herramientas como código fuente. Descargan copias de las herramientas, administran el almacenamiento y las usan dentro de árboles de archivos administrados. 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 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 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 entradas y salidas determinadas, el sistema de compilación puede construir un grafo 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 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 una con diferentes herramientas y versiones.
  • Reproducibilidad: Las compilaciones herméticas son útiles para solucionar problemas porque conoces las condiciones exactas que produjeron la compilación.

Identificar la 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. Algunas fuentes comunes de no hermeticidad en las 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 marcas de tiempo o IDs de compilación
  • Objetos binarios del sistema que difieren entre hosts (como objetos binarios /usr/bin, rutas de acceso absolutas, compiladores de C++ del sistema para la configuración automática de reglas de C++ nativas)
  • Escribir en el árbol de fuentes durante la compilación Esto evita que se use el mismo árbol de fuentes para otro destino. La primera compilación escribe en el árbol de fuentes, lo que corrige el árbol de fuentes para el destino A. Entonces, es posible que falle el intento de compilar el destino B.

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 las compilaciones secuenciales nulas sean nulas: si ejecutas make y obtienes una compilación correcta, ejecutar la compilación nuevamente no debería recompilar ningún destino. Si ejecutas cada paso de compilación dos veces o en sistemas diferentes, comparas un hash del contenido del archivo y obtienes resultados que difieren, la compilación no es reproducible.
  • Ejecuta los pasos para depurar los aciertos de caché local de una variedad de máquinas cliente potenciales para asegurarte de detectar cualquier caso de entorno del cliente que se filtre en las acciones.
  • Ejecuta una compilación dentro de un contenedor de Docker que solo contenga el árbol de fuentes cancelado 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 hermeticidad con las reglas de ejecución remota.
  • Habilita la zona de pruebas estricta a nivel de cada acción, ya que las acciones de una compilación pueden tener estado y afectar la compilación o el resultado.
  • Las reglas de lugar de trabajo permiten a los desarrolladores agregar dependencias a lugares de trabajo externos, pero son lo suficientemente enriquecidas para permitir que ocurra procesamiento arbitrario en el proceso. Puedes obtener un registro de algunas acciones potencialmente no herméticas en las reglas del lugar de trabajo de Bazel si agregas 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 compilaciones herméticas con Bazel, consulta estas charlas de BazelCon: