Установите модуль npm из частного репозитория gitlab

98

Мы используем GitLab для нашего частного проекта. Есть несколько разветвленных библиотек из github, которые мы хотим установить как модуль npm. Установка этого модуля прямо из npm - это нормально, например:

npm install git://github.com/FredyC/grunt-stylus-sprite.git

... тоже работает правильно, но если сделать то же самое для GitLab, просто смена домена вызывает эту ошибку.

npm WARN `git config --get remote.origin.url` returned wrong result (git://git.domain.com/library/grunt-stylus-sprite.git)
npm ERR! git clone git://git.domain.com/library/grunt-stylus-sprite.git Cloning into bare repository 'D:\users\Fredy\AppData\Roaming\npm-cache\_git-remotes\git-git-domain-com-library-grunt-stylus-sprite-git-6f33bc59'...
npm ERR! git clone git://git.domain.com/library/grunt-stylus-sprite.git fatal:unable to connect to git.domain.com:
npm ERR! git clone git://git.domain.com/library/grunt-stylus-sprite.git git.domain.com[0: 77.93.195.214]: errno=No error
npm ERR! Error: Command failed: Cloning into bare repository 'D:\users\Fredy\App
Data\Roaming\npm-cache\_git-remotes\git-git-domain-com-library-grunt-stylus-spr
ite-git-6f33bc59'...
npm ERR! fatal: unable to connect to git.domain.com:
npm ERR! git.domain.com[0: xx.xx.xx.xx]: errno=No error

Из веб-интерфейса GitLab у меня есть этот URL git@git.domain.com:library/grunt-stylus-sprite.git. Запустив это против, npm installон пытается установить gitмодуль из реестра npm.

Однако использование URL: git+ssh@git.domain.com:library/grunt-stylus-sprite.gitвнезапно запрашивает у меня пароль. Мой SSH-ключ не включает парольную фразу, поэтому я предполагаю, что он не смог загрузить этот ключ. Может быть, есть какая-то конфигурация, которую я пропустил? Ключ находится в стандартном месте в моем домашнем каталоге с именем "id_rsa".

У меня Windows 7 x64.

ОБНОВИТЬ

Начиная с NPM v3 есть встроенная поддержка GitLab и других источников (BitBucket, Gist), откуда вы можете устанавливать пакеты. К сожалению, это работает только для общедоступных, поэтому не совсем связано с этим, но некоторым может быть полезно.

npm install gitlab:<gitlabname>/<gitlabrepo>[#<commit-ish>]

Ознакомьтесь с документацией: https://docs.npmjs.com/cli/install

FredyC
источник
1
Итак, какой фактический URL-адрес gitlab я использую? Я просто вижу, что <placeholders>пробовал несколько вариантов, но все равно говорится, что проект не найден.
chovy
1
$ npm i -S git+ssh://git@gitlab.com/org/repo.gitне работает
chovy

Ответы:

157

У вас есть следующие методы для подключения к частному репозиторию gitlab

С SSH

git+ssh://git@git.mydomain.com:Username/Repository#{branch|tag}
git+ssh://git@git.mydomain.com/Username/Repository#{branch|tag}

С HTTPS

git+https://git@git.mydomain.com/Username/Repository#{branch|tag}

С HTTPS и токеном развертывания

git+https://<token-name>:<token>@gitlab.com/Username/Repository#{branch|tag}
Сидхуко
источник
Да, это примерно то, что я понял. Вы даже можете указать ветку или тег, например Repository#1.2.3. Я поменяю галочку ответа, так как это более точно.
FredyC
1
@jamessidhu Я не уверен, но он спрашивает меня пароль даже с SSH. При вводе пароля возникает ошибка. Есть идеи, как это решить?
codenooker
@codesnooker Вы установили SSH-ключ в Gitlab ? Если ключи не авторизованы между вашим компьютером и удаленным компьютером, по умолчанию будет использоваться пароль, такой как доступ к серверу.
Сидхуко
5
На самом деле это работает для меня только с истинным синтаксисом URL, например git+ssh://git@git.mydomain.com/Username/Repository(обратите внимание на /, разделяющий хост и имя пользователя). Это может быть специфическая вещь, возможно, предложенный пример действительно работает с npm
Иво ван дер Вейк,
1
токен развертывания отлично работает. <token-name>в примере, похоже gitlab+deploy-token-17034, это не произвольное имя, которое вы назначаете токену.
Mr5o1
26

Вместо того git://, чтобы использовать git+ssh://и npm, следует поступать правильно.

Айзекс
источник
5
Ответ от самого создателя npm 👆
Дима Паржицкий 05
Я получаюundefined ls-remote <url>
chovy
git + ssh: git@git.mydomain.com/Username/Repositor, удалите // у меня работает. Thx
AliasCocoa
23

Обновить

Как упоминал @felix в комментариях (спасибо @felix), использование deploy tokenгораздо более актуально для чтения частного реестра gitlab. Таким образом, токен скомпрометирован, злоумышленник просто может прочитать этот репозиторий и не сможет вносить изменения.

Создание токена развертывания

  1. Войдите в свою GitLabучетную запись.
  2. Перейдите к проекту, для которого хотите создать токены развертывания.
  3. Перейдите в Настройки> Репозиторий.
  4. Нажмите Expandна раздел Deploy Tokens.
  5. Выберите имя и, при необходимости, дату истечения срока действия токена.
  6. Выберите желаемые объемы. <= выбратьread_repository
  7. Щелкните Создать токен развертывания.
  8. Сохраните токен развертывания в безопасном месте. Когда вы покинете или обновите страницу, вы больше не сможете получить к ней доступ.

Старый ответ

Перейти User Settings > Access Tokensи создать новый access tokenс read_registryразрешением.

введите описание изображения здесь

Копия сгенерирована token, она нам нужна для нашего package.jsonфайла.

введите описание изображения здесь

Теперь package.jsonдобавьте, dependencyкак показано ниже:

"my-module": "git+https://Xaqron:token@gitlab.com/Xaqron/my-module"

Замените Xaqronсвоим именем пользователя и tokenсгенерированным токеном. Вы можете указать branchи tagв конце url #{branch|tag}.

Примечание. Поскольку токен доступа находится у package.jsonвсех, у кого есть доступ к этому проекту, он может читать репозиторий, поэтому я предполагаю, что ваш проект является частным.

Xaqron
источник
5
Другой способ - создать токен развертывания для этого конкретного репозитория. Тогда он не предоставляет доступ на чтение для всех ваших репозиториев. "private-module": "git+https://gitlab+deploy-token-username:deploy-token@gitlab.com/you/project",
Крис Саттингер
npm ERR! enoent undefined ls-remote -h -t https://puump:pass@gitlab.com/puump/puump-content.git
chovy
2
@chovy: Install git see
Xaqron
2
Я также хочу отметить, что если ваш проект находится внутри группы, вы должны определить это:, "private-module": "git+https://gitlab+deploy-token-username:deploy-token@gitlab.com/group_name/project"поэтому вместо your username, вы должны определить group_nameперед именем проекта
sfarzoso
8

Хотя вопрос касается Gitlab, этот вопрос довольно хорошо оценивается в поиске Google, поэтому вот еще немного информации о том, как исправить аналогичную проблему, которую я получил с Github.

Для меня только изменение URL-адреса не помогло. Вот шаги, которые мне пришлось предпринять, чтобы это исправить:

  • git+ssh://git@github.com:owner/repo.git#master
  • Создайте ключ развертывания и добавьте его в репо
  • Отредактируйте конфигурацию git ( ~/.ssh/configсоздайте файл, если он не существует), чтобы принудительно использовать DeployKey вместо ключа ssh по умолчанию

После этого установка npm просто заработала. Все остальные варианты и решения, вызванные нарушением установки npm

Сефи
источник
это должно быть опечатка. :owner?
chovy
1
что мне делать ~/.ssh/config? Я все еще не разобрался с npm / gitlab
chovy
6

Просто для всех, кто сталкивается с этим, я вообще не мог заставить его работать через HTTPS - кажется, он не поддерживает прямую ссылку на репо (например https://git.domain.com/user/somerepo.git), а также не поддерживает версии .tar, .tar.bzили .zipархивные.

Только вроде работает с .tar.gzархивом.

Полный пример (с помеченной версией):

https://git.domain.com/user/somerepo/repository/archive.tar.gz?ref=v1.2.3

chrisf
источник
5

Ни один из других ответов не помог мне для частного репозитория gitlab.com ...

Однако это работает:

npm i -S git+ssh://git@gitlab.com:<org>/<project>.git

Это просто git ssh clone url из поля ввода "clone" страницы проекта, git+ssh://добавленный перед ним.

чови
источник
1
это работает, учитывая, что ваш открытый ключ ssh уже настроен в учетной записи gitlab.
lasec0203
3

Насколько я могу судить, в чем вы ошибаетесь, так это в git://протоколе. GitLab поддерживает только HTTP (s) и SSH для клонов. Поэтому вы должны использовать один из этих методов вместо протокола git.

Сэм Глеске
источник
3

Для меня установите package.json, как показано ниже.

"dependencies": {
    "<module-name>": "git+http://<username>:<token>@url.git",
}

Токен можно получить в разделе «Настройки профиля - Токен доступа».

Шентаой
источник
Это сработало и для меня. Я работаю через прокси с самоподписанным сертификатом.
Стефано Моцарт
это действительно сработало для меня, но мне интересно, стоит ли оставить токен в package.json, поскольку другие могут использовать его для записи? gitlab (по крайней мере, в моем случае) не позволяет мне создавать токен доступа только для чтения, а только токен с полным доступом. что ты думаешь?
Cancebero
Примечание. В GitLab 10.7 (выпущен в апреле 2018 г.) добавлены «токены развертывания» на уровне проекта. Их следует использовать вместо «токена доступа» на уровне пользователя. ссылка на документы
0

Если вы хотите использовать переменную среды, содержащую токен, вместо жестко запрограммированного токена в URL-адресе, я придумал решение, даже довольно сложное. Мы будем использовать GIT_ASKPASSпеременную среды, чтобы получить пароль из сценария bash, этот сценарий будет отображать переменную среды. Чтобы преодолеть npm, передавая только определенные переменные среды GIT, мы будем использовать GIT_SSHв качестве посредника.

Таким образом, учитывая , git_pass_env.shсодержащие echo $GIT_SSHмы можем просто позвонить:

GIT_SSH=<TOKEN> GIT_ASKPASS="$(pwd)/git_pass_env.sh" npm install

Для примера проекта с docker и docker-compose см. Мое репо здесь .

Блок-схема переменных среды:

схема

YoniXw
источник
0

Gitlab теперь имеет реестр пакетов, в котором можно создавать, развертывать и размещать пакеты npm. С частными репозиториями можно обеспечить детальный контроль доступа к содержимому репозитория и пакетам.

Пакеты NPM можно установить из частных репозиториев Gitlab, добавив .npmrcфайл рядом package.json. Больше информации здесь . Хотя это усложняется при использовании нескольких токенов развертывания для разных репозиториев в одной кодовой базе.

С помощью Gitlab можно получить доступ к .tgzфайлу пакета напрямую по HTTPS и развернуть токен . Просто добавьте зависимость проекта следующим образом:

"@foo/bar": "https://<username>:<token>@gitlab.com/api/v4/projects/<project-id>/packages/npm/@foo/bar/-/@foo/bar-1.0.0.tgz"

@ foo / bar присутствует в URL дважды. @foo - это объем проекта, а bar - это имя модуля, а 1.0.0 - имя модуля. project-id (8-значное число) - это идентификатор проекта Gitlab, который можно увидеть на странице проекта под именем. Можно даже опустить @foo в имени модуля (но не в ссылке).

Использование нескольких модулей с одинаковой областью действия и разных токенов развертывания обеспечивает безопасность управления частными репозиториями. Кроме того, токены развертывания могут иметь только доступ, package registryчто означает, что конечный пользователь не сможет получить доступ к полному исходному коду из репозиториев.

Палаш Бансал
источник