Nuevo en Symfony: compilaciones reproducibles

Las compilaciones reproducibles ("reproducible builds" en inglés) son una serie de prácticas de desarrollo de software que permiten "verificar la transformación del código fuente en el código binario que se ejecuta en los dispositivos". En otras palabras, si el código fuente no cambia, el resultado de compilarlo siempre debería ser exactamente el mismo.

Aplicado al caso de Symfony: el contenedor de servicios y los archivos de caché generados para una aplicación cuyo código fuente no cambia, deberían ser siempre los mismos, no importa dónde, cuándo o cómo compiles la aplicación.

¿Por qué son importantes las compilaciones reproducibles? Porque cuando se hace un análisis del código, los analistas humanos siempre miran el código fuente, pero los dispositivos siempre ejecutan el código compilado. Así que si la compilación es reproducible, puedes compilar tu mismo el código que has analizado y comparar el resultado con el código que se está ejecutando para comprobar que sean iguales. Lo mejor es que este proceso se puede repetir por parte de varios analistas independientes de manera que se asegure que un cierto código compilado tiene su origen en un determinado código fuente.

En la práctica, las compilaciones reproducibles requieren que la compilación sea totalmente determinista. Así que por ejemplo no pueden contener fechas y horas o valores generados aleatoriamente. Este no era el caso de Symfony y alguna de las librerías de terceros que utiliza, como Monolog y Doctrine.

Para hacer que Symfony generara compilaciones reproducibles, tuvimos que hacer muchos pequeños cambios (y los hemos hecho en la rama 3.4 para que no tengas que actualizarte a 4.0 para disfrutar de ellos):

  • Los nombres de las variables ya no son aleatorios en las plantillas Twig compiladas (twig#2621)
  • Los nombres de las clases generados para los proxies de los servicios lazy ya no son aleatorios (symfony#25978)
  • El bundle de Monolog ya no genera IDs aleatorios para algunos de sus servicios (monolog-bundle#248)
  • El adaptador filesystem de la caché de Symfony ha cambiado para que los elementos que no expiran no dependan del tiempo (antes expiraban en un año) (symfony#26127)
  • El contenedor de Symfony utiliza la fecha y hora de la compilación para generar un hash único que lo identifica. Ahora este tiempo se puede configurar con el parámetro kernel.container_build_time (symfony#26128)

Las aplicaciones Symfony ya son reproducibles, pero todavía te puedes encontrar algún problema en librerías típicamente utilizadas junto a Symfony. Por ejemplo:

  • El prefijo del cargador de clases de Composer cuando se utiliza APCu no es determinista (composer#7049)

Esta funcionalidad fue contribuida por Lars Strojny en el pull request #25958.

Fuente: New in Symfony: Reproducible builds

Comentarios

Publicada el

28 de febrero de 2018

Etiquetas

Proyectos Symfony destacados

La plataforma de eCommerce 100% Symfony que rivaliza con Magento y PrestaShop. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.