Installer le module npm à partir du référentiel privé gitlab

97

Nous utilisons GitLab pour notre projet privé. Il existe des bibliothèques fourchues de github, que nous voulons installer en tant que module npm. L'installation de ce module directement à partir de npm est ok et par exemple ceci:

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

... fonctionne correctement aussi, mais faire la même chose pour GitLab, changer de domaine me donne cette erreur.

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

Depuis l'interface Web de GitLab, j'ai cette URL [email protected]:library/grunt-stylus-sprite.git. L'exécution de cela contre npm installelle tente d'installer le gitmodule à partir du registre npm.

Cependant, utiliser URL: [email protected]:library/grunt-stylus-sprite.gitme demande soudainement le mot de passe. Ma clé SSH n'inclut pas de phrase de passe, donc je suppose qu'elle n'a pas pu charger cette clé. Peut-être y a-t-il une configuration que j'ai manquée? La clé se trouve à l'emplacement standard de mon répertoire personnel avec le nom "id_rsa".

Je suis sous Windows 7 x64.

METTRE À JOUR

Depuis NPM v3, il existe une prise en charge intégrée de GitLab et d'autres sources (BitBucket, Gist), à partir desquelles vous pouvez installer des packages. Malheureusement, cela ne fonctionne que pour les publics, donc ce n'est pas exactement lié à cela, mais certains pourraient le trouver utile.

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

Consultez la documentation: https://docs.npmjs.com/cli/install

FredyC
la source
1
Alors, quelle est l'url gitlab que j'utilise? Je vois juste que <placeholders>j'ai essayé plusieurs variantes et il est toujours indiqué que le projet n'a pas été trouvé.
chovy
1
$ npm i -S git+ssh://[email protected]/org/repo.gitne fonctionne pas
chovy

Réponses:

157

Vous disposez des méthodes suivantes pour vous connecter à un référentiel gitlab privé

Avec SSH

git+ssh://[email protected]:Username/Repository#{branch|tag}
git+ssh://[email protected]/Username/Repository#{branch|tag}

Avec HTTPS

git+https://[email protected]/Username/Repository#{branch|tag}

Avec HTTPS et déployer le jeton

git+https://<token-name>:<token>@gitlab.com/Username/Repository#{branch|tag}
Sidhuko
la source
Ouais, c'est à peu près ce que j'ai compris. Vous pouvez même spécifier une branche ou une balise comme Repository#1.2.3. Je changerai le tick de réponse car c'est plus précis.
FredyC
1
@jamessidhu Je ne suis pas sûr mais il me demande un mot de passe même avec SSH. En donnant le mot de passe, cela me donne une erreur. Une idée comment le résoudre?
codesnooker
@codesnooker Avez-vous configuré une clé SSH dans Gitlab ? Si les clés ne sont pas autorisées entre votre machine et la télécommande, il s'agira par défaut d'un mot de passe comme l'accès à un serveur.
sidhuko
5
En fait, cela ne fonctionne que pour moi avec la vraie syntaxe URL, par exemple git+ssh://[email protected]/Username/Repository(notez le / séparant l'hôte et le nom d'utilisateur). Cela peut être une chose spécifique au fil, peut-être que l'exemple suggéré fonctionne avec npm
Ivo van der Wijk
1
Le jeton de déploiement fonctionne très bien. <token-name>dans l'exemple gitlab+deploy-token-17034, ce n'est pas le nom arbitraire que vous attribuez au jeton.
Mr5o1
26

Au lieu de git://, use git+ssh://et npm devraient faire la bonne chose.

Isaacs
la source
5
Réponse de npm creator lui-même 👆
Dmitry Parzhitsky
Je reçoisundefined ls-remote <url>
chovy
git + ssh: [email protected]/Username/Repositor, supprimez // cela fonctionne pour moi. Thx
AliasCocoa
22

Mettre à jour

Comme @felix l'a mentionné dans les commentaires (merci @felix), l'utilisation deploy tokenest beaucoup plus pertinente pour lire un registre privé sur gitlab. De cette façon, le jeton est compromis, l'attaquant peut simplement lire ce référentiel et ne peut pas apporter de modifications.

Création d'un jeton de déploiement

  1. Connectez-vous à votre GitLabcompte.
  2. Accédez au projet pour lequel vous souhaitez créer des jetons de déploiement.
  3. Accédez à Paramètres> Référentiel.
  4. Cliquer sur Expand section Déployer des jetons.
  5. Choisissez un nom et éventuellement une date d'expiration pour le jeton.
  6. Choisissez les portées souhaitées. <= sélectionnerread_repository
  7. Cliquez sur Créer un jeton de déploiement.
  8. Enregistrez le jeton de déploiement dans un endroit sûr. Une fois que vous avez quitté ou actualisé la page, vous ne pourrez plus y accéder.

Ancienne réponse

Aller User Settings > Access Tokenset créer un nouveau access tokenavec la read_registrypermission.

entrez la description de l'image ici

Copie générée token, nous en avons besoin pour notre package.jsonfichier.

entrez la description de l'image ici

Maintenant, package.jsonajoutez le dependencycomme ci-dessous:

"my-module": "git+https://Xaqron:[email protected]/Xaqron/my-module"

Remplacez Xaqronpar votre nom d'utilisateur et tokenpar le jeton généré. Vous pouvez spécifier branchet tagà la fin de l'url par #{branch|tag}.

Remarque: Étant donné que le jeton d'accès est situé dans package.jsontoute personne ayant accès à ce projet peut lire le référentiel, je suppose donc que votre projet est lui-même privé.

Xaqron
la source
5
L'autre méthode consiste à créer un jeton de déploiement pour ce référentiel spécifique. Ensuite, il n'accorde pas d'accès en lecture pour tous vos dépôts. "private-module": "git+https://gitlab+deploy-token-username:[email protected]/you/project",
Chris Sattinger
npm ERR! enoent undefined ls-remote -h -t https://puump:[email protected]/puump/puump-content.git
chovy
2
@chovy: Install git see
Xaqron le
1
Je tiens également à souligner que si votre projet est à l'intérieur d'un groupe, vous devez définir ceci "private-module": "git+https://gitlab+deploy-token-username:[email protected]/group_name/project"your usernamegroup_name
:,
8

Bien que la question concerne Gitlab, cette question est assez bien classée dans la recherche Google, voici donc quelques informations supplémentaires sur la façon de résoudre un problème similaire que j'ai rencontré avec Github.

Pour moi, seule la modification de l'URL ne l'a pas fait fonctionner. Voici les étapes à suivre pour résoudre ce problème:

  • git+ssh://[email protected]:owner/repo.git#master
  • Créez une clé de déploiement et ajoutez-la au référentiel
  • Editez git config ( ~/.ssh/configcréez le fichier s'il n'existe pas) pour forcer l'utilisation de DeployKey au lieu de la clé ssh par défaut

Après cela, l'installation de npm a tout simplement fonctionné. Toutes les autres options et solutions résultent de la rupture de l'installation de npm

Sephy
la source
cela doit être une faute de frappe. :owner?
chovy
1
que dois-je faire ~/.ssh/config? Je n'ai toujours pas fini avec npm / gitlab
chovy le
6

Juste pour tous ceux qui trébuchent sur cela, je ne pouvais pas du tout le faire fonctionner sur HTTPS - il semble qu'il ne prend pas en charge le lien direct vers le dépôt (par exemple https://git.domain.com/user/somerepo.git), ni ne prend en charge le .tar, .tar.bzou.zip des versions d' archives.

Cela semble fonctionner uniquement avec le .tar.gz archive.

Exemple complet (avec version balisée):

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

chrisf
la source
5

Aucune des autres réponses n'a fonctionné pour moi pour un dépôt gitlab.com privé ...

Cela fonctionne cependant:

npm i -S git+ssh://[email protected]:<org>/<project>.git

C'est juste l'url du clone git ssh du champ de saisie "clone" de la page du projet avec l' git+ssh://ajout au début de celui-ci.

chovy
la source
1
cela fonctionne, étant donné que votre clé publique ssh est déjà configurée sur le compte gitlab.
lasec0203
3

Pour autant que je sache, où vous vous trompez, c'est le git://protocole. GitLab ne prend en charge que HTTP (s) et SSH pour les clones. Vous devez donc utiliser l'une de ces méthodes au lieu du protocole git.

Sam Gleske
la source
3

Pour moi, définissez le package.json comme ci-dessous fonctionne.

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

Le jeton est obtenu à partir de vos "Paramètres de profil - Jeton d'accès".

shentaoy
la source
Cela a fonctionné pour moi aussi. Je travaille derrière un proxy avec un certificat auto-signé.
Stefano Mozart
cela a fonctionné pour moi mais je me demande si c'est une bonne idée de laisser le jeton dans le package.json puisque d'autres pourraient l'utiliser pour écrire? gitlab (du moins dans mon cas) ne me permet pas de créer un jeton d'accès en lecture seule mais seulement un jeton à accès complet. Qu'est-ce que tu penses?
cancerbero
Remarque: GitLab 10.7 (publié en avril 2018) a ajouté des «Deploy Tokens» au niveau du projet. Ceux-ci doivent être utilisés à la place d'un "jeton d'accès" de niveau utilisateur. lien vers la documentation
0

Si vous souhaitez utiliser une variable d'environnement contenant le jeton au lieu d'un jeton codé en dur dans l'URL, j'ai proposé une solution même difficile assez complexe. Nous utiliserons la GIT_ASKPASSvariable d'environnement pour obtenir le mot de passe d'un script bash, ce script fera écho à une variable d'environnement. Pour surmonter npm en passant uniquement des variables d'environnement GIT spécifiques, nous utiliserons GIT_SSHcomme intermédiaire.

Donc, étant donné git_pass_env.shcontenant, echo $GIT_SSHnous pouvons simplement appeler:

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

Pour un exemple de projet avec docker et docker-compose, consultez mon dépôt ici .

Diagramme de flux des variables d'environnement:

représentation schématique

YoniXw
la source
0

Gitlab dispose désormais d'un registre de packages dans lequel il est possible de créer, déployer et héberger des packages npm. Avec les référentiels privés, il est possible de fournir un contrôle d'accès précis sur le contenu du référentiel et les packages.

Les packages NPM peuvent être installés à partir de référentiels Gitlab privés en ajoutant un .npmrcfichier à côté package.json. Plus d'infos ici . Bien que cela devienne compliqué lors de l'utilisation de plusieurs jetons de déploiement pour différents référentiels dans la même base de code.

Avec Gitlab, il est possible d'accéder au .tgzfichier de package directement avec HTTPS et de déployer un jeton . Ajoutez simplement la dépendance du projet comme ceci:

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

@ foo / bar est présent deux fois dans l'URL. @foo est la portée du projet et bar est le nom du module et 1.0.0 est le nom du module. project-id (8 chiffres numériques) est l'ID du projet Gitlab, qui peut être vu à partir de la page du projet sous le nom. Il est même possible d'omettre @foo du nom du module (mais pas du lien).

L'utilisation de plusieurs modules avec la même portée et différents jetons de déploiement sécurise la gestion des référentiels privés. De plus, les jetons de déploiement peuvent uniquement avoir accès à package registryce qui signifie que l'utilisateur final ne pourra pas accéder au code source complet à partir des référentiels.

Palash Bansal
la source