Я хочу раскрыть всю мощь параллелизма, запустив некоторые связанные с Ivy задачи Ant на локальном Bamboo. агенты. Наша машина Bamboo оснащена мощным процессором и оперативной памятью.
Если я разделю свою задачу сборки на параллельные задания, каждое из которых будет создавать разные артефакты на основе результата ivy-retrieve
, я решу свою проблему в теории.
На практике, к сожалению, если две задачи Ant по какой-то причине выполняются одновременно на одной машине и в одной и той же организации-артефакте, они будут конфликтовать, и одна из них получит ошибку XML.
У меня нет точного сообщения об ошибке, потому что 1) проблема случайна для воспроизведения и 2) я уже проделал большую работу, чтобы поместить все задания в последовательное. Но у меня есть четкое представление о том, что происходит.
Когда Ant запускает ivy-retrieve, приведенный ниже код, он будет использовать локальный каталог кеша пользователя, который оказывается /home/bamboo/.ivy2/cache
. Там я могу найти множество resolved-[org]-[artifact]-[version].xml
файлов (каждый из которых представляет собой другую версию сборки моего проекта). Проблема возникает, когда я хочу запустить задачу ivy-retrieve дважды, например, одну для конфигурации compile
, а другую для runtime
. Два XML-файла будут конфликтовать, и Ivy сообщит об ошибке SAX при чтении одного из файлов, потому что он выглядит так, как будто он записывается в данный момент.
Если я запускаю задание на удаленных агентах, я не ожидаю проблем, но у меня уже есть 5 локальных агентов, и Bamboo не будет запускать удаленных агентов, если локальные агенты свободны.
К сожалению, все мои работы, независимые друг от друга, требуют другого извлечения плюща. В настоящее время я запускаю их последовательно.
Вопрос в том
Можно ли указать Ivy, работающему на агенте Bamboo, использовать временный уникальный каталог кеша для работы с файлами dependencies.xml, а не использовать глобальный кеш? Или максимум синхронизировать доступ к файлам?
Во втором варианте параллельный процесс Ant может читать и записывать кэшированный файл dependencies.xml исключительно на взаимной основе. Так что то, что они читают, всегда будет согласованным файлом (будучи одним и тем же файлом, мне все равно, перезапишет ли процесс другой)