Repositorios de git de caching instalados con Composer desde el origen en Travis CI (y otras herramientas de CI)?

Trabajo en varios packages de Symfony alojados en GitHub y probados automáticamente con Travis CI.

La parte más larga de las testings es la installation de los requisitos por parte de Composer.

Configuré Travis CI para instalar packages con la composer update --prefer-dist y almacenar en $HOME/.composer/cache directory $HOME/.composer/cache . Las testings tomaron un time total de 18 minutos , gracias al almacenamiento en caching:

Instalación de doctrine / lexer (v1.0.1)

Cargando desde el caching

Pero hace una semana vi un post de Composer:

Instalación de doctrine / lexer (v1.0.1)

Descargando: Conectando … Error al download Doctrina / Lexer desde dist: No se pudo autenticar contra github.com

Cambié la configuration a la composer update --prefer-source debido a esto. Esta parece ser una práctica común en todos los packages de Symfony. El set de testings tomó 28 minutos .

Sé que puedo registrar las keys de GitHub en Travis CI para evitar el límite de API al usar la --prefer-dist Composer --prefer-dist .

¿Hay alguna otra forma de almacenar en caching las dependencies? Por ejemplo, clonando los repositorys de dependencies en un caching?

GitHub ha eliminado los límites de la tasa API, el composer ahora se puede usar con --prefer-dist y los files zip se pueden almacenar en caching. Aquí hay un ejemplo de configuration en .travis.yml :

 cache: directories: - $HOME/.composer/cache # … install: - composer update --prefer-dist 

Aquí está el anuncio:

Hola Niels y Jordi,

Hemos dedicado un time a investigar, considerando todas las opciones para resolver sus problemas, sopesando sus necesidades frente a la tensión y la disponibilidad de la infraestructura.

Me complace informar que nuestro equipo de Infraestructura cree que debido a su trabajo en nuestro back-end de Git desde que se introdujeron estas API, ahora podemos eliminar estos límites de tarifas en el lado de la API. Implementamos esos cambios hace un par de horas. Obtener un enlace de file 1 a través de la API ya no contará en contra de su límite de velocidad por hora (autenticado o no). Esto debería hacer que Composer se instale feliz.

Háganos saber si ve algún negocio divertido.

Aclamaciones,

Wynn Netherland
Gerente de Ingeniería de Plataforma, GitHub

Fuente

Probé el almacenamiento en caching del vendor/ directory y funcionó. Utilicé tar para crear un file comprimido $HOME/vendor-cache/ y configuré un CI de Travis para este directory.

Los commands tienen dos objectives:

  1. Extraiga el vendor/ del caching si está disponible
  2. Poner el vendor/ en el caching después de las testings

Aquí hay un ejemplo de file .travis.yml :

 sudo: false language: php cache: directories: - $HOME/.composer/cache # This is where vendor/ backups will be stonetworking - $HOME/vendor-cache/ php: - […] env: - SYMFONY_VERSION="2.7.*" - SYMFONY_VERSION="2.8.*" - SYMFONY_VERSION="3.0.*" before_install: # Create an hash corresponding to the PHP version and the dependencies - tohash="${SYMFONY_VERSION}" - cachefile="`echo -n "$tohash" | sha1sum | cut -d " " -f 1`.tar" # Extract cache archive if the file exists - if [[ -f $HOME/vendor-cache/$cachefile ]]; then tar -xf $HOME/vendor-cache/$cachefile ; fi install: - composer self-update - composer update --profile --no-progress script: php ./vendor/bin/phpunit # Create cache archive from vendor/ directory before_cache: - if [[ -f $HOME/vendor-cache/$cachefile ]]; rm -fv $HOME/vendor-cache/$cachefile ; fi - tar -cf $HOME/vendor-cache/$cachefile vendor/ 

Aquí hay un file .travis.yml completamente anotado con más salida detallada:

 sudo: false language: php cache: directories: - $HOME/.composer/cache # This is where vendor/ backups will be stonetworking - $HOME/vendor-cache/ git: depth: 5 php: - […] env: - SYMFONY_VERSION="2.7.*" - SYMFONY_VERSION="2.8.*" - SYMFONY_VERSION="3.0.*" before_install: # Create an hash corresponding to the PHP version and the dependencies - echo "Vendor cache content:" ; ls -lh $HOME/vendor-cache/ - echo "Values used for hash:" - tohash="${SYMFONY_VERSION}" - echo "$tohash" - cachefile="`echo -n "$tohash" | sha1sum | cut -d " " -f 1`.tar" - echo "cachefile = ${cachefile}" # Extract cache archive if the file exists - if [[ -f $HOME/vendor-cache/$cachefile ]]; then echo "Extract cache archive"; tar -xf $HOME/vendor-cache/$cachefile ; echo "Done" ; else echo "Cache archive does not exist" ; fi - if [[ -d vendor/ ]]; then echo "Size of vendor directory extracted from cache:" ; du -hs vendor/; else echo "vendor/ directory does not exist"; fi install: - composer self-update - composer update --profile --no-progress script: php ./vendor/bin/phpunit # Create cache archive from vendor/ directory before_cache: - if [[ -f $HOME/vendor-cache/$cachefile ]]; then echo "Delete previous cache archive"; rm -fv $HOME/vendor-cache/$cachefile ; echo "Done" ; else echo "No cache archive to delete" ; fi - echo "Create cache archive" ; tar -cf $HOME/vendor-cache/$cachefile vendor/ ; echo "Done" - echo "Size of cache archive:" ; ls -lh $HOME/vendor-cache/$cachefile 

Al usar este método, la composer update tomó 30 segundos , en lugar de aproximadamente 2 minutos sin caching (tenga en count que la comparación no es perfecta, se aplican algunos otros cambios, pero aún así es una buena estimación).

Es preferible limitar el número de construcciones paralelas la primera vez que inicias comstackciones, para que las cachings no sufran una condición de carrera.