Как стать автором
Обновить

npm+maven+docker=nexus

Всем привет! Меня зовут Досжан. Я являюсь DevOps инженер с опытом более 4 лет. До этого программировал на разных языках как JS, Python, PHP, C++, Delphi. Когда только учился программировать и разбираться с компьютерными технологиями застал эпоху, когда интернет был не всегда и не везде. Приходилось бегать с флешками или ЖД.

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

У каждого пакетного менеджера или сборщика есть свои утилиты для хранения и кэширования данных для локального использования. Но для меня всегда удобно, когда все хранится в одном месте. Это помогает решить проблему и с распределением доступа и с администрированием по уходу за сервисом.

Когда впервые познакомился с продуком Sonatype Nexus использовал его только для хранения артифактов Maven. Поднял его на докере, примантировал папку для хранения blob репозитория и пробросил порты.

docker run -d -p 8081:8081 -p 5050:5050 --name nexus -v nexus-data:/nexus-data sonatype/nexus3

По умолчанию настроены репозитории для snapshot и release с группой для их объединения. То есть если вы и дальше будете использовать Nexus в качестве репозитория для Maven то вам больше нет необходимости что-то делать. Только указать в сборщике чтобы он обращался в локальное хранилище. Сделать это можно двумя способами.

  1. При сборке поставив флаг

    -Dmaven.repo.local=<путь к вашему серверу с nexus>
  2. Добавив параметры в ~/.m2/settings.xml

Аналогичным образом настроим репозитории для npm. Рецепт такой же, только вместо release у нас будет proxy который будет обращаться https://registry.npmjs.org если не найдет пакет в hosted. Дальше при сборке, чтобы обращаться к нему необходимо создать .npmrc. Но для начала надо сделать хэш логина и пароля следующим образом

echo -n 'username:password' | openssl base64
; Nexus proxy registry pointing to http://registry.npmjs.org/
registry = http://<host>/<название group репозитория>/ 

; base64 encoded authentication token
_auth = <see question below>

; required by Nexus
email = <valid email>

; force auth to be used for GET requests
always-auth = true

; we don't want to put certificates in .npmrc
strict-ssl = false

loglevel = silly

Nexus позволяет не только хранить npm паректы, там так же есть репозитории для apt, yum, pip даже helm chart может собирать. Настройка которых такая же как для npm.

С Docker Registry немного отличается. Хоть там и есть proxy и другие варианты, нам понадобится только hosted. В форме нового репозитория указываем название и порт (если не подгружали валидные сертификаты то лучше использовать http). Порт должен быть доступен снаружи. Если Вы запустили docker для nexus-a как в моем примере то укажите 5050.

Так как у нас http при авторизации будет ругать что не отвечает по https. Для этого в файле /etc/docker/daemon.json добавляем

{
    "insecure-registries" : [ "хост:5050" ],
    "live-restore": true
}

и перезапускам daemon для docker следующей командой

sudo systemctl reload docker

и можно логиниться

docker login --username пользователь --password пароль

Чтобы образы падали в локальный репозиторий необходимо чтобы они начинались с <хост>/<название репозитория>/<название образа>:<тэг>

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

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.