2015-06-05 8 views
5

È possibile memorizzare le gemme in cache, in modo che bundle install non installerà un mucchio di gemme per ogni build? Questo richiede 5 minuti per ogni build, è troppo.CircleCI gems caching

ho aggiunto questo al circle.yml config:

dependencies: 
    cache_directories: 
    - "/home/ubuntu/.rvm/gems/ruby-2.1.2/gems/" 

Questa è la directory comune che è fornito da bundle show gem_name in cui tutte le gemme di sistema sono messi.

Dopo questo sistema inoltre scrive tale registro:

restoring cache v4/company/repo_name/dependency/circle-ci/42/mGWhlYQIxyOy0GZtt4QmCw__.tar.gz 
restoring home/ubuntu/repo_name/vendor/bundle, home/ubuntu/.m2, home/ubuntu/.ivy2, home/ubuntu/.go_workspace, home/ubuntu/.gradle, home/ubuntu/.rvm/gems/ruby-2.1.2/gems 

Quindi, per quanto ho capito, ripristina le gemme di sistema e gemme installati in vendor/bundle, però, continuo a vedere questo (e questo richiede un sacco di tempo):

Installing rake 10.4.2 
Installing i18n 0.7.0 
Installing json 1.8.2 
Installing minitest 5.5.1 
... 

invece di

using rake 10.4.2 
using i18n 0.7.0 
using json 1.8.2 
using minitest 5.5.1 
... 

Quindi, se em, dovrebbe funzionare, ma non è così. Cosa può essere sbagliato?

+0

Ho già trovato la soluzione. Risponderà più tardi. – kovpack

+0

Posso chiedere la soluzione che hai trovato? grazie. – stmllr

+0

Ho appena aggiunto la risposta – kovpack

risposta

17

La soluzione è semplice: CircleCI esegue alcuni comandi per impostazione predefinita e memorizza nella cache le gemme anche per impostazione predefinita in vendor/bundle, quindi non è necessario aggiungere nulla a cache_directories.

Tra questi comandi predefiniti è bundle check --path=vendor/bundle || bundle install --path=vendor/bundle --jobs=4 --retry=3, che verifica la presenza di gem nella directory della cache e li installa se non ci sono.

Nel mio caso avevo un progetto costituito da più applicazioni (applicazione principale, interfaccia utente comune, client API e API simulata) suddiviso in 4 diversi repository. La maggior parte di loro aveva bisogno dei comandi bundle install.

L'unica cosa che dovevo fare è sostituire tutti i miei comandi bundle install (che installa sempre gemme) con bundle check --path=vendor/bundle || bundle install --path=vendor/bundle --jobs=4 --retry=3. In tal caso, tutte le gem sono installate solo la prima volta che eseguo i test e tutte le build seguenti utilizzano gemme precedentemente memorizzate nella cache.

+1

Non capisco questa risposta. Il mio file 'circle.yml' non contiene un comando' bundle install', quindi come posso sostituirlo? –

+2

@ PeterH.Boling sto assumendo che in quel caso il tuo file circle.yml stia eseguendo i comandi dedotti e non li hai sovrascritti .. specifica un override e lo userà sopra i comandi dedotti. –

+0

Sembra funzionare tranne le gemme con estensioni native come – pean