Featured image of post Как настроить GitLab Private NPM Registry? Лучшие практики для управления несколькими пакетами и правами доступа

Как настроить GitLab Private NPM Registry? Лучшие практики для управления несколькими пакетами и правами доступа

Решите проблемы конфигурации GitLab Private NPM Registry, включая логику .npmrc, управление несколькими пакетами и устранение ошибок 404, с использованием лучших практик для единого реестра.

Вы застряли на конфигурации .npmrc, потому что проекту вашей компании необходимо использовать Private Packages?

Почему все еще отображается 404 Not Found , даже если токен настроен?

Когда в компании есть несколько команд и несколько пакетов (например, @frontend, @backend), как вы можете элегантно управлять .npmrc?

Разоблачение двух мифов о .npmrc

Чтобы понять .npmrc, вам сначала нужно понять, как он работает.

Проще говоря, его основная логика сводится к двум вещам: Сопоставление области видимости (Scope Mapping) и Аутентификация (Authentication).

1. Сопоставление области видимости (Scope Mapping)

Это говорит npm: когда вы видите пакет, начинающийся с @company, не ищите его на официальном npmjs.org, а перейдите в наш указанный GitLab Registry.

@company:registry=https://gitlab.com/api/v4/groups/100/-/packages/npm/

2. Аутентификация (Authentication)

С адресом вам также нужен ключ. Ключ — это ваш AuthToken.

Вот очень важное правило: URL-адрес реестра и путь AuthToken должны «точно совпадать».

# ✅ Верно: путь точно такой же, как у реестра, определенного выше
//gitlab.com/api/v4/groups/100/-/packages/npm/:_authToken=${GITLAB_TOKEN}

# ❌ Неверно: путь не совпадает, что приведет к ошибке прав доступа
//gitlab.com/api/v4/:_authToken=${GITLAB_TOKEN}

Многие люди часто терпят неудачу при настройке из-за лишней косой черты или отсутствия уровня в пути.

Ад зависимостей и ошибки 404

Самая головная боль — это когда вы устанавливаете пакет A, который зависит от пакета B (тоже приватного), а затем npm выдает ошибку 404 Not Found.

Почему так происходит? Это происходит потому, что npm теряется при разрешении зависимостей, если нет правильного соответствия.

Особенно, когда у вас есть две разные области видимости (например, @team-a и @team-b) в разных группах GitLab, .npmrc может стать чрезвычайно сложным и трудным в поддержке. Вкупе с тем фактом, что разные реестры могут требовать разные токены, одного управления этими переменными окружения достаточно, чтобы вас насытить.

Есть ли более разумный способ?

Рекомендуемое решение: Единый реестр группы загрузки и Независимый реестр проекта публикации

Реестр Описание
Group Registry Чтобы иметь возможность унифицировать загрузку всех пакетов, унифицируйте настройку Group Registry для загрузки всех пакетов в этой группе GitLab.
Project Registry Чтобы иметь права доступа при публикации, каждый проект может настроить свой собственный Project Registry для публикации.

Зачем это делать?

Причина Описание
Простая установка Можно легко устанавливать и загружать все пакеты в одной группе.
Простая публикация Можно легко публиковать пакеты в их соответствующих проектах, избегая публикации разных пакетов в одном реестре, у каждого проекта есть свой реестр.
Простое управление токенами Будь то компьютер разработчика или среда CI/CD, необходимо поддерживать только один набор GITLAB_NPM_TOKEN.
Избегайте ошибок зависимостей Все приватные пакеты находятся в одном месте, npm совершенно точно не пропустит их.

Конфигурация в действии

Вы можете скопировать этот шаблон напрямую:

Не забудьте переложить работу по защите токенов на переменные окружения, никогда не прописывайте токены прямо в коде!

# .npmrc
# Токен аутентификации уровня домена (охватывает все запросы на установку уровня группы и проекта)
//gitlab.com/:_authToken=${GITLAB_NPM_TOKEN}

# Для публикации: токен аутентификации уровня проекта (npm publish требует точного совпадения пути)
//gitlab.com/api/v4/projects/YOUR_PROJECT_ID/packages/npm/:_authToken=${GITLAB_NPM_TOKEN}

# область действия @company использует реестр уровня группы
# Все пакеты @company/* будут установлены из этого реестра
@company:registry=https://gitlab.com/api/v4/groups/YOUR_GROUP_ID/-/packages/npm/

# Другие публичные пакеты по-прежнему идут в официальную библиотеку
registry=https://registry.npmjs.org/

Настройте publishConfig в package.json для публикации пакета в соответствующем GitLab Project Registry.

{
  "name": "@company/my-package",
  "publishConfig": {
    "@company:registry": "https://gitlab.com/api/v4/projects/YOUR_PROJECT_ID/packages/npm/"
  }
}

Заключение

Благодаря стратегии “Единого реестра группы загрузки” и “Независимого реестра проекта публикации” мы можем значительно снизить затраты на обслуживание и сделать процесс разработки более плавным.

Цель Описание
Точное соответствие Сопоставление области видимости и путь токена должны быть полностью согласованы
Безопасность превыше всего Эффективно используйте переменную окружения ${GITLAB_NPM_TOKEN} для управления личной информацией
Централизованное управление Приоритетное использование единой группы GitLab для загрузки всех приватных пакетов компании
Независимая публикация Приоритетное использование независимых проектов GitLab для публикации соответствующих приватных пакетов, управляя соответствующими пакетами независимо, чтобы избежать путаницы

Освоив эту логику, GitLab NPM Registry станет мощным помощником в процессе разработки вашей компании!

All rights reserved,未經允許不得隨意轉載
Создано при помощи Hugo
Тема Stack, дизайн Jimmy