Встановіть модуль npm із приватного сховища gitlab


97

Ми використовуємо 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


1
так яка фактична URL-адреса gitlab я використовую? Я просто бачу, що <placeholders>я спробував кілька варіантів, і там все ще сказано, що проект не знайдений.
chovy

1
$ npm i -S git+ssh://git@gitlab.com/org/repo.gitне працює
човий

Відповіді:


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 ? Якщо ключі не авторизовані між вашою машиною та пультом дистанційного керування, за замовчуванням буде встановлено пароль, як-от доступ до сервера.
sidhuko

5
Це насправді працює лише для мене із справжнім синтаксисом URL-адреси, наприклад git+ssh://git@git.mydomain.com/Username/Repository(зверніть увагу на / розділення хосту та імені користувача). Це може бути річ, що стосується пряжі, можливо, запропонований приклад працює з npm
Ivo van der Wijk

1
токен розгортання чудово працює. <token-name>у прикладі виглядає gitlab+deploy-token-17034, це не довільне ім'я, яке ви присвоюєте маркеру.
Mr5o1,

26

Замість git://, use git+ssh://та npm повинні робити правильно.


5
Відповідь від самого розробника npm 👆
Дмитро Паржицький

Я отримуюundefined ls-remote <url>
човий

git + ssh: git@git.mydomain.com/Username/Repositor, видалити // це працює для мене. Thx
AliasCocoa

22

Оновлення

Як @felix згадано в коментарях (спасибі @felix), використання deploy tokenнабагато актуальніше для читання приватного реєстру gitlab. Таким чином, маркер порушено, зловмисник просто може прочитати це сховище і не може вносити зміни.

Створення маркера розгортання

  1. Увійдіть у свій GitLabакаунт.
  2. Перейдіть до проекту, для якого ви хочете створити токени розгортання.
  3. Перейдіть до Налаштування> Сховище.
  4. Клацніть на Expandрозділ Розгортання токенів.
  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кожного, хто має доступ до цього проекту, може читати сховище, тому я припускаю, що ваш проект є приватним.


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
човий

2
@chovy: Встановити git див.
Xaqron

1
Я також хочу зазначити, що якщо ваш проект знаходиться всередині групи, то вам слід визначити це:, "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 config ( ~/.ssh/configстворіть файл, якщо він не існує), щоб змусити використовувати DeployKey замість ключа ssh за замовчуванням

Після цього встановлення npm просто спрацювало. Усі інші варіанти та рішення призвели до порушення встановлення npm


це має бути друкарська помилка. :owner?
човий

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


5

Жодна з інших відповідей не працювала для мене для приватного репозиторію gitlab.com ...

Однак це працює:

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

Це просто URL-адреса клонування git ssh із поля вводу "клон" сторінки проекту, 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 (принаймні в моєму випадку) не дозволяє мені створювати маркер доступу лише для читання, а лише повний доступ. що ти думаєш?
ракберо

Примітка: 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 див. Моє репо тут .

Схема потоків змінних середовища:

блок-схема


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 - це обсяг проекту, а бар - це назва модуля, а 1.0.0 - назва модуля. project-id (8-значний числовий) - це ідентифікатор проекту Gitlab, який можна побачити на сторінці проекту під назвою. Можна навіть опустити @foo з імені модуля (але не посилання).

Використання декількох модулів з однаковим обсягом та різними маркерами розгортання робить управління приватними сховищами безпечним. Також токени Deploy можуть мати доступ лише до того, package registryщо означає, що кінцевий користувач не зможе отримати доступ до повного вихідного коду зі сховищ.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.