2015-06-05 10 views
5

Czy można buforować klejnoty, aby bundle install nie instalowało wielu klejnotów dla każdej kompilacji? Zajmuje to 5 minut na każdej kompilacji, to za dużo.Pamięć CircleCI buforowanie

Dodałem to do circle.yml config:

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

Jest to wspólny katalog, który jest przez bundle show gem_name gdzie wszystkie kamienie systemowe są umieszczane.

Po tym systemie dodawania pisze taki log:

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 

Tak, o ile mi zrozumieć, przywraca klejnoty i kamienie zainstalowanych w vendor/bundle systemowych, jednak wciąż widzę to (i to zajmuje dużo czas):

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

zamiast

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

Tak, to se ems, powinno działać, ale tak nie jest. Co może być nie tak?

+0

Znalazłem już rozwiązanie. Odpowiem później. – kovpack

+0

czy mogę prosić o rozwiązanie, które znalazłeś? dzięki. – stmllr

+0

Właśnie dodałem odpowiedź – kovpack

Odpowiedz

17

Rozwiązanie jest proste: CircleCI uruchamia niektóre polecenia domyślnie i domyślnie buforuje klejnoty również w vendor/bundle, więc nie ma potrzeby dodawać niczego do cache_directories.

Wśród tych domyślnych poleceń jest bundle check --path=vendor/bundle || bundle install --path=vendor/bundle --jobs=4 --retry=3, który sprawdza obecność klejnotów w katalogu pamięci podręcznej i instaluje je, jeśli ich tam nie ma.

W moim przypadku miałem projekt składający się z wielu aplikacji (główna aplikacja, wspólny interfejs użytkownika, klient API i sztuczka API) podzielony na 4 różne repozytorium. Większość z nich potrzebowała poleceń bundle install.

Jedyne, co musiałem zrobić, to wymienić wszystkie moje polecenia bundle install (które zawsze instaluje klejnoty) z bundle check --path=vendor/bundle || bundle install --path=vendor/bundle --jobs=4 --retry=3. W takim przypadku wszystkie klejnoty są instalowane tylko przy pierwszym uruchomieniu testów, a wszystkie poniższe kompilacje używają wcześniej zapisanych klejnotów.

+1

Nie rozumiem tej odpowiedzi. Mój plik 'circle.yml' nie zawiera polecenia' bundle install', więc jak mogę go zastąpić? –

+2

@ PeterH.Boling Zakładam, że w tym przypadku twój plik circle.yml uruchamia polecenia, których się nie spodziewasz, i nie zastąpiłeś ich. Podaj przesłonięcie i użyje go do wywnioskowania poleceń. –

+0

Wydaje się działać z wyjątkiem klejnotów z rozszerzeniami natywnymi – pean