Search
Write a publication
Pull to refresh

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 пароль

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

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

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.