С чего все началось
Требовалось кешировать используемые в разных проектах NPM пакеты (+ хранить свои) на отдельном сервере.
Было решено делать это с помощью репозитария Verdaccio (по нему есть достаточно хорошая офф. дока), крутиться это все должно в Docker, а разворачиваться GitLab CI/CD.
Т.к. реализация данной схемы заняла у меня некоторое время (Хотелось бы и по меньше), решил написать короткий туториал по этой теме, с описание нюансов, которые для меня казались не очевидными.
Цель
Бесперебойная работа разработчиков над приложениями. Вне зависимости от внешних обстоятельств.
Сборка проектов по CI/CD должна происходить с использование локального NPM репозитария
И так приступим.
Что нам понадобится
Сервер на котором будет крутиться наш Verdaccio (Ubuntu, Docker, Docker-compose), он же целевой сервер
Сервер с GitLab (В нашем случае отдельный, там хранится собранный образ Verdaccio с нашими Конфигами)
Описание Установки Docker + Docker-compose опущу намеренно, ибо описание данного процесса великое множество, в том числе и на Хабре.
Далее пошагово
Шаг первый
Создаем проект Verdaccio, создаем структуру и файлы.
.gitlab-ci.yml - конфигурация pipeline для Build и Deploy нашего образа Docker Verdaccio на целевой сервер.
Verdaccio/config.yaml - свой конфиг файл, со следующим содержанием
storage: /verdaccio/storage/data # Где хранинится КЕШ пакетов и собственные пакеты
plugins: /verdaccio/plugins # Где хранинятся Плагины к Verdaccio, у нас не используются
web:
title: Verdaccio
auth:
htpasswd:
file: /verdaccio/storage/htpasswd # Тут хранятся логины и пароли(в кодировке) все пользователей
max_users: 100
uplinks:
npmjs:
url: https://registry.npmjs.org/
cache: true
packages:
"@*/*":
access: $all
publish: $authenticated
unpublish: $authenticated
proxy: npmjs
"**":
access: $all
publish: $authenticated
unpublish: $authenticated
proxy: npmjs
server:
keepAliveTimeout: 60
middlewares:
audit:
enabled: true
log: { type: stdout, format: pretty, level: http }
Verdaccio/docker-compose.yml - файл для развертывания в docker через docker-compose
version: "3.7"
services:
verdaccio:
container_name: 'verdaccio'
image: yourGitLabServer.com:5050/verdaccio:vedaccio # подготовленный Image
restart: unless-stopped
networks:
- node-network
environment:
- VERDACCIO_PORT=4873 #порт на котором работает Verdaccio можно менять
ports:
- 4873:4873 #порт Verdaccio внутренний : порт по которому он будет доступен из вне
volumes:
- /var/verdaccio/storage:/verdaccio/storage
networks:
node-network:
driver: bridge
Тут /var/verdaccio/storage - Нужно предварительно создать каталог на целевом сервере и назначить на него владельца и группу, в противном случае будет ошибка прав.
chown -R 10001:65533 /var/verdaccio/storage
Verdaccio/Dockerfile - Докер файл по которому Билдим свой образ Verdaccio
Тут все просто, офф образ Verdaccio + копируем свой конфиг
FROM verdaccio/verdaccio:5.6.0
ADD config.yaml /verdaccio/conf/config.yaml
Шаг второй
Развертывание проекта на целевом сервере
Далее схематично опишу, весь процесс:
Заливаем наш проект на GitLab
Запускаем сборку образа (Build)
Деплоим наш образ Verdaccio на целевой сервер
В каталоге /var/verdaccio/ выполняем команду
docker-compose up -d
Переходим в браузере по пути http://IP Вашего целевого сервера:4873/
И наблюдаем интерфейс
Шаг третий
Настраиваем наш проект, что бы он работал через наш Verdaccio, для этого в проекте в терминале выполняем команду:
npm set registry http://10.0.1.149:7777/ --location project
Или
Создать/редактировать в проекте файл .npmrc (Расположение рядом с файлом package.json и где формируется папка node_modules)в нем должна быть строка: registry=http://IP Вашего целевого сервера:4873/
Далее чистим Кеш NPM на локальном компе, что бы пакеты подгрузились в Verdaccio, для этого выполняем команду
npm cache clean --force
Удаляем папку node_modules если она имеется, и выполняем npm install
После загрузки пакетов, они так же будут загружены в кеш Verdaccio по пути: целевой сервер - var/verdaccio/storage/data
Выводы
При такой организации, все проекты которые разрабатываются на локальных компах разработчиков, собираются и деплоятсяпо CI/CD будут работать через наш Verdaccio, что поможет нам избежать проблем с возможной временной недоступностью пакетов.
П.С.
Для развертывания всего выше описанного использовались материалы:
Официальной документации Verdaccio
Так же статей с Хабры, за что огромное им спасибо:
https://habr.com/ru/articles/427069/
https://habr.com/ru/articles/453614/
https://habr.com/ru/articles/657881/
К сожалению в вышеуказанных статьях не нашел исчерпывающего ответа на свои вопросы, по этому написана текущая статья.
Комментарии (8)
ckpunT
01.06.2023 16:05Gitlab и Verdaccio можно сконнектить через OpenID и не мучаться с паролями в htpasswd. Даст возможность использовать CI_JOB_TOKEN в джобах и авторизовываться в web-интерфейсе по кнопке
AmirALM Автор
01.06.2023 16:05Про данный способ в курсе, но в данных условиях он будет излишним. Имеется специфика внутренней инфраструктуры.
Elgreen
А зачем это все, если в GitLab уже есть встроенный npm registry, даже во free tier?
Leopotam
Следующий шаг - selfhosted gitea.
darkxanter
Verdaccio может проксировать npmjs.com
Karen
Мы для этого используем Nexus Sonatype OSS, который кроме прочего умеет и много других форматов пакетов, в том числе и в режиме проксирования, а это собственно и было ключевой фичей, за которую мы его выбрали.
darkxanter
Nexus конечно удобен что он поддерживает многие форматы репозиториев, но только он требует много под себя ресурсов. Для себя мы используем Verdaccio, reposilite и docker registry, чтобы кэшировать зависимости.
AmirALM Автор
Было необходимо не только хранить свои пакеты и использовать их в проектах и сборках. Одна из основных целей, это кеширование всех пакетов используемых в проектах, что бы в случае блокировки, процесс разработки не пострадал.
Про Вами указанный вариант посмотрел, данный вариант не подходит в моем случае, тем не менее благодарю за новое знание.)