Дженкинс: Должен ли я использовать разные локальные репозитории maven для своих сборок?

#maven #jenkins #continuous-integration

#maven #Дженкинс #непрерывная интеграция

Вопрос:

У меня есть экземпляр Jenkins, на котором выполняются сборки нескольких микросервисов и библиотек.

В настоящее время моя сборка настроена таким образом, что все задания используют разные локальные репозитории $WORKSPACE/.m2/repository .

Это хорошо, потому что сборки не могут влиять друг на друга, однако сборки, очевидно, имеют тенденцию быть намного длиннее, потому что им нужно загружать все зависимости каждый раз.

Как вы думаете, какое решение лучше? Должен ли я сохранить текущую конфигурацию или достаточно безопасно использовать одно и то же локальное хранилище для всех заданий?

Есть ли способ гарантировать, что сборки не могут влиять друг на друга, даже если локальный репозиторий одинаков?

Мне приходит в голову, что я мог бы настроить проект так, чтобы все снимки обновлялись каждый раз. Этого достаточно? Как я могу сделать это из моего settings.xml ?


У меня есть несколько вопросов в комментариях, и я думаю, что лучше ответить на них здесь, так что:

Почему я удаляю свою папку репозитория перед каждой сборкой?

Потому что репозиторий находится в папке заданий Дженкинса (в настоящее время). Я очищаю папку заданий, потому что иногда мне нужно изменять pom во время сборки. (Измените версию для выпуска).

У вас много веток? Вы используете менеджер репозиториев?

Да, я делаю.

Сколько у вас узлов jenkins?

В настоящее время только один, но это может измениться в будущем.

Как вы строите на Дженкинсе (имеется в виду), какую точную команду выполнения maven вы используете в Дженкинсе?

Я использую mvn clean deploy , с некоторыми дополнительными свойствами

Комментарии:

1. Вы удаляете .repository до / после каждой сборки?

2. да, я каждый раз начинаю с чистого листа. Может быть, это еще одно направление, в котором я могу повысить производительность

3. Почему вы это делаете? Как вы строите на Дженкинсе (имеется в виду), какую точную команду выполнения maven вы используете в Дженкинсе? У вас много веток? Другое дело: используете ли вы менеджер репозиториев? Сколько у вас узлов jenkins?

4. Я ответил на ваши вопросы в редактировании

5. Исходя из этой ситуации, я бы использовал только репозиторий, расположенный в каждой рабочей области в Jenkins. Но я бы не стал удалять это пространство для каждой сборки до / после сборки. Кроме того, я хотел бы знать, сколько времени занимает ваша сборка? Сколько модулей / тестов / и т. Д. у вас есть?

Ответ №1:

Что бы вы ни делали, убедитесь, что один локальный репозиторий не используется более чем одной сборкой одновременно. Локальный репозиторий небезопасен для одновременного использования. Вы легко нарушаете метаданные, если две сборки пытаются обновить один и тот же СНИМОК.

Ответ №2:

Мое текущее решение заключается в том, что я создал каталог за пределами дома Дженкинса, /maven/.m2/repository/ . Но это не сам локальный репозиторий.

Фактический репозиторий: <localRepository>/maven/.m2/repository/${env.JOB_NAME}</localRepository> . Таким образом, я получаю разные репозитории для каждого задания, но они не удаляются, когда рабочее пространство удаляется для задания.