Глобальный репозиторий Maven для Gitlab строится внутри док-контейнера - PullRequest
0 голосов
/ 13 января 2019

Я запускаю установку Gitlab внутри док-контейнера. Сборки также выполняются в док-контейнерах. Поскольку я собираю в основном артефакты Maven, необходимо загружать зависимости для каждой сборки, что обеспечивает большую пропускную способность. Мне удалось уменьшить это, по крайней мере, для сборок одного и того же артефакта с использованием предоставленного кэша, но это работает только для последовательных сборок.

Есть ли способ создания глобального хранилища maven вне установки Gitlab, к которому все контейнеры сборки имеют доступ, поэтому зависимости нужно загружать только один раз?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Я бы посоветовал запустить внутренний сервер репозитория Maven и попросить ваши сборки Dovenized Maven использовать его. Некоторые из них существуют, я обнаружил, что Nexus хорошо работает с нашими потребностями (объединенное представление Maven Central и внутренний репозиторий), и его можно легко запустить с

docker run -p 8081:8081 --name nexus sonatype/nexus3

После этого вы можете иметь очень простой файл settings.xml в вашей сборочной Maven-сборке:

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                      https://maven.apache.org/xsd/settings-1.0.0.xsd">
    <mirrors>
        <mirror>
            <id>local-nexus</id>
            <name>Local Nexus</name>
            <!-- Host external IP number -->
            <url>http://172.17.0.1:8081/repository/central/</url>
            <mirrorOf>central</mirrorOf>
        </mirror>
    </mirrors>
    <!-- applied to the image we were using, may not apply to yours -->
    <localRepository>/usr/share/maven/ref/repository</localRepository>
</settings>

Я считаю, что IP-номер 172.17.0.1 был первым, назначенным Docker в этой настройке. Для организованных сборок у него, скорее всего, будет настоящее имя.

Вы по-прежнему будете загружать половину Интернета, но только из внутреннего репозитория, когда он будет полностью заполнен.

0 голосов
/ 13 января 2019

Вы можете позволить кешу жить вне контейнеров на хосте и монтировать его как том в контейнеры, которые в них нуждаются. Для контейнеров сборки просто подключите папку хоста, содержащую кэш, в контейнер, где ожидается кэш maven (обычно /home/<user>/.m2/repository)

Например, чтобы смонтировать /path/on/host с хоста в /path/in/container внутри контейнера, используйте следующую команду:

docker run -v /path/to/host/folder:/path/in/container buildImage:latest 

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

РЕДАКТИРОВАТЬ: Как Thorbjørn Ravn Andersen указал в комментарии предложение выше может привести к проблемам в случае параллельной работы нескольких сборочных контейнеров, так как Maven принимает на себя владение .m2 каталог. В этом случае может быть лучше настроить контейнеры сборки на использование менеджера репозитория артефактов, такого как Nexus, работающего в отдельном контейнере. Затем контейнер Nexus может смонтировать диск формы репозитория, чтобы отсоединить его от жизненного цикла контейнера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...