Oto co Zdecydowałem się zrobić:
I zostały zmodyfikowane mój plik ivysettings.xml
mieć następujące:
<ivysettings>
<properties environment="env." override="false"/>
<caches
defaultCacheDir="${ivy.default.ivy.user.dir}/cache-${env.EXECUTOR_NUMBER}"
resolutionCacheDir="${ivy.dir}/../target/ivy.cache"/>
<settings defaultResolver="default"/>
<include file="${ivy.dir}/ivysettings-public.xml"/>
<include url="${ivy.default.settings.dir}/ivysettings-shared.xml"/>
<include url="${ivy.default.settings.dir}/ivysettings-local.xml"/>
<include url="${ivy.default.settings.dir}/ivysettings-main-chain.xml"/>
<include url="${ivy.default.settings.dir}/ivysettings-default-chain.xml"/>
</ivysettings>
ten ma dwie rzeczy:
- Definiuje Ivy lokalna pamięć podręczna jako
$HOME/.ivy/cache-$EXECUTOR_NUMBER
gdzie $EXECUTOR_NUMBER
jest wykonawcą Jenkins. Oznacza to, że każdy wykonawca otrzymuje własną pamięć podręczną bluszczu. Tak więc, jeśli Jenkins wykonuje więcej niż jedno zadanie na raz, każde zadanie zostanie odebrane za pomocą innego executora, więc będzie mieć własną pamięć podręczną. Jeśli zadanie chce wyczyścić pamięć podręczną, może zostać wykonane z wyprzedzeniem.
- Zdefiniowałem pamięć podręczną rozpoznawania na
${basedir}/target/ivy.cache
. Daje to każdemu zadaniu własną pamięć podręczną przelicznika, która jest dość mała. Ale w ten sposób rozwiązywanie ivy nie koliduje z innymi zadaniami, jeśli Jenkins buduje wiele poprawek tego samego projektu Ivy.
Jedyną wadą jest to, że domyślny katalog pamięci podręcznej użytkownika nazywa się $HOME/.ivy/cache-$env.EXECUTOR_NUMBER
, co nie jest ładną stroną. Chciałbym uczynić to bardziej rozsądnym $HOME/.ivy/cache-0
, ale nie doszedłem do tego. W rzeczywistości jednak nie ma to żadnego wpływu.
Teraz programista ma jedną pamięć podręczną Ivy, która zawiera wszystkie słoiki, które pobrały. W ten sposób słoiki mogą być dzielone między projekty, co przyspiesza prace programistów.
Tymczasem Jenkins może czyścić pamięć podręczną bluszcza tak często, jak jest skonfigurowana. Można to zrobić dla każdego zadania lub raz dziennie lub miesięcznie. Jednakże, ponieważ pamięć podręczna jest wykonywana dla każdego executora, nie będę miał problemu z czyszczeniem pamięci podręcznej, podczas gdy inne zadanie (które byłoby uruchomione na innym executorze) zależy od tej pamięci podręcznej.
To powinno rozwiązać wszystkie szczególne problemy. Jedyne, co chciałbym zrobić, to dowiedzieć się, jak ustawić domyślną zmienną EXECUTOR_NUMBER, jeśli jeszcze nie została ustawiona. Próbowałem różnych rzeczy takich jak to:
<ivysettings>
<property name="env.EXECUTOR_NUMBER" value="0" override="false"/>
<properties environment="env." override="false"/>
<caches
defaultCacheDir="${ivy.default.ivy.user.dir}/cache-${env.EXECUTOR_NUMBER}"
resolutionCacheDir="${ivy.dir}/../target/ivy.cache"/>
<settings defaultResolver="default"/>
<include file="${ivy.dir}/ivysettings-public.xml"/>
<include url="${ivy.default.settings.dir}/ivysettings-shared.xml"/>
<include url="${ivy.default.settings.dir}/ivysettings-local.xml"/>
<include url="${ivy.default.settings.dir}/ivysettings-main-chain.xml"/>
<include url="${ivy.default.settings.dir}/ivysettings-default-chain.xml"/>
</ivysettings>
Ale na próżno. Zmieniono zmianę parametrów override
na obu plikach <property>
i <properties>
na różne sposoby, ale nie całkiem to, co chcę.
Dzięki. Czyszczenie pamięci podręcznej dodaje tylko około 90 sekund do kompilacji (mamy lokalne repozytorium Maven). Nie ma to wpływu na koncepcję _CI_, więc nie zaszkodzi by Jenkins uruchomił każdy build z czystym pamięcią podręczną. Programiści mogą wyłączyć, ustawiając ivy.cleancache na false. Jak na ironię, czyszczenie pamięci podręcznej drażni twórców, ponieważ wydłuża kompilację, ale nie ma na nią wpływu. Jenkins nie dba o to, ale jeśli Jenkins wykonuje wiele zadań, może to stanowić problem. –