Работа с NPM¶
CodeScoring.Save реализует npm Registry API с префиксом /npm/<project>/<repository>/. Совместим со стандартными клиентами npm, yarn и pnpm.
Proxy-репозиторий¶
curl -X POST https://save.example.com/api/v1/repos \
-H "Content-Type: application/json" \
-u "<username>:<password>" \
-d '{
"project": "frontend",
"name": "npmjs-proxy",
"format": "npm",
"repository_type": "proxy",
"remote_url": "https://registry.npmjs.org",
"cache_ttl": 3600
}'
Hosted-репозиторий¶
curl -X POST https://save.example.com/api/v1/repos \
-H "Content-Type: application/json" \
-u "<username>:<password>" \
-d '{
"project": "frontend",
"name": "npm-hosted",
"format": "npm",
"repository_type": "hosted"
}'
Настройка клиента¶
npm¶
# Установка registry в текущем проекте
echo "registry=https://save.example.com/npm/<project>/npmjs-proxy/" > .npmrc
# Аутентификация (npm 7+, _auth — base64(username:password))
NPM_AUTH=$(echo -n "<username>:<password>" | base64)
cat >> .npmrc << EOF
//save.example.com/npm/<project>/npmjs-proxy/:_auth=${NPM_AUTH}
//save.example.com/npm/<project>/npmjs-proxy/:always-auth=true
EOF
# Установка зависимости
npm install lodash
Robot-аккаунты в CI
Для CI/CD используйте robot-аккаунт: username = sa$<robot-name>, password = <api-key>. Структура .npmrc не меняется — отличается только значение _auth (base64 от sa$<robot-name>:<api-key>). Подробнее — в общем разделе Аутентификация.
Opaque bearer-токены
npm-клиент после npm adduser / npm login сохраняет полученный opaque-токен и далее использует его как Authorization: Bearer <token>. cs-auth классифицирует любой не-JWT bearer-токен (Bearer-значение без трёх сегментов через точку) как npm_token и валидирует через сервис-аккаунты, привязанные к API-ключам.
Публикация в hosted-репозиторий:
cat > .npmrc << EOF
registry=https://save.example.com/npm/<project>/npm-hosted/
//save.example.com/npm/<project>/npm-hosted/:_auth=${NPM_AUTH}
//save.example.com/npm/<project>/npm-hosted/:always-auth=true
EOF
npm publish
yarn¶
Yarn Classic (1.x)¶
Yarn 1.x использует тот же .npmrc, что и npm:
Yarn 2+ (Berry)¶
В .yarnrc.yml:
npmRegistryServer: "https://save.example.com/npm/<project>/npmjs-proxy/"
npmRegistries:
"https://save.example.com/npm/<project>/npmjs-proxy/":
npmAlwaysAuth: true
npmAuthIdent: "<username>:<password>"
pnpm¶
pnpm читает тот же .npmrc:
Для scoped-пакетов можно настроить отдельный registry:
Миграция URL репозитория¶
Сценарий использования: миграция npm-репозитория с Nexus / Artifactory на CodeScoring.Save.
| Источник | .npmrc registry= до миграции |
.npmrc registry= после миграции |
|---|---|---|
| Nexus | https://nexus.host.ru/repository/npm-proxy |
https://save.example.com/npm/<project>/npmjs-proxy/ |
| Artifactory | https://jfrog.host.ru/artifactory/api/npm/npm-remote |
https://save.example.com/npm/<project>/npmjs-proxy/ |
| Официальный репозиторий | https://registry.npmjs.org |
https://save.example.com/npm/<project>/npmjs-proxy/ |
При миграции достаточно заменить URL в .npmrc/.yarnrc.yml. Существующие credentials Nexus/Artifactory можно переиспользовать как Basic Auth.
Устранение неполадок¶
Проверка метаданных пакета¶
Whoami / ping¶
curl -u "<username>:<password>" \
https://save.example.com/npm/<project>/npmjs-proxy/-/whoami
curl -u "<username>:<password>" \
https://save.example.com/npm/<project>/npmjs-proxy/-/ping
Состояние сервиса¶
Аудит по репозиторию¶
curl -u "<username>:<password>" \
"https://save.example.com/api/v1/admin/audit?resource_type=repository&q=npmjs-proxy&limit=50"