С чего все началось

Требовалось кешировать используемые в разных проектах 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

Шаг второй

Развертывание проекта на целевом сервере

Далее схематично опишу, весь процесс:

  1. Заливаем наш проект на GitLab

  2. Запускаем сборку образа (Build)

  3. Деплоим наш образ Verdaccio на целевой сервер

  4. В каталоге /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)


  1. Elgreen
    01.06.2023 16:05
    -1

    А зачем это все, если в GitLab уже есть встроенный npm registry, даже во free tier?


    1. Leopotam
      01.06.2023 16:05
      -1

      Следующий шаг - selfhosted gitea.


    1. darkxanter
      01.06.2023 16:05
      +2

      Verdaccio может проксировать npmjs.com


      1. Karen
        01.06.2023 16:05
        +1

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


        1. darkxanter
          01.06.2023 16:05

          Nexus конечно удобен что он поддерживает многие форматы репозиториев, но только он требует много под себя ресурсов. Для себя мы используем Verdaccio, reposilite и docker registry, чтобы кэшировать зависимости.


    1. AmirALM Автор
      01.06.2023 16:05

      Было необходимо не только хранить свои пакеты и использовать их в проектах и сборках. Одна из основных целей, это кеширование всех пакетов используемых в проектах, что бы в случае блокировки, процесс разработки не пострадал.
      Про Вами указанный вариант посмотрел, данный вариант не подходит в моем случае, тем не менее благодарю за новое знание.)


  1. ckpunT
    01.06.2023 16:05

    Gitlab и Verdaccio можно сконнектить через OpenID и не мучаться с паролями в htpasswd. Даст возможность использовать CI_JOB_TOKEN в джобах и авторизовываться в web-интерфейсе по кнопке


    1. AmirALM Автор
      01.06.2023 16:05

      Про данный способ в курсе, но в данных условиях он будет излишним. Имеется специфика внутренней инфраструктуры.