Installa il modulo npm dal repository privato di gitlab


97

Stiamo usando GitLab per il nostro progetto privato. Ci sono alcune librerie forkate da github, che vogliamo installare come modulo npm. L'installazione di quel modulo direttamente da npm va bene e ad esempio questo:

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

... funziona anche correttamente, ma facendo lo stesso per GitLab, il solo cambio di dominio mi dà questo errore.

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

Dall'interfaccia web di GitLab, ho questo URL git@git.domain.com:library/grunt-stylus-sprite.git. Eseguendolo contro di npm installesso si tenta di installare il gitmodulo dal registro npm.

Tuttavia, utilizzando URL: git+ssh@git.domain.com:library/grunt-stylus-sprite.gitimprovvisamente mi sta chiedendo la password. La mia chiave SSH non include la passphrase, quindi presumo che non sia stata in grado di caricare quella chiave. Forse c'è qualche configurazione per quello che mi sono perso? La chiave si trova nella posizione standard nella mia directory home con il nome "id_rsa".

Sono su Windows 7 x64.

AGGIORNARE

A partire da NPM v3 è disponibile il supporto integrato per GitLab e altre fonti (BitBucket, Gist), da cui è possibile installare i pacchetti. Sfortunatamente funziona solo per quelli pubblici, quindi non è esattamente correlato a questo, ma alcuni potrebbero trovarlo utile.

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

Consulta la documentazione: https://docs.npmjs.com/cli/install


1
quindi qual è l'URL di gitlab che utilizzo? Vedo solo che <placeholders>ho provato diverse varianti e dice ancora che il progetto non è stato trovato.
chovy

1
$ npm i -S git+ssh://git@gitlab.com/org/repo.gitnon funziona
chovy

Risposte:


157

Hai i seguenti metodi per connetterti a un repository gitlab privato

Con SSH

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

Con HTTPS

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

Con HTTPS e distribuisci token

git+https://<token-name>:<token>@gitlab.com/Username/Repository#{branch|tag}

Sì, è più o meno quello che ho capito. Puoi anche specificare branch o tag come Repository#1.2.3. Cambierò il segno di spunta della risposta poiché è più accurato.
FredyC

1
@jamessidhu Non ne sono sicuro, ma mi sta chiedendo la password anche con SSH. Dopo aver dato la password mi sta dando un errore. Qualche idea su come risolverlo?
codesnooker

@codesnooker Hai impostato una chiave SSH in Gitlab ? Se le chiavi non sono autorizzate tra la tua macchina e il telecomando, per impostazione predefinita verrà impostata una password come l'accesso a un server.
sidhuko

5
Questo in realtà funziona solo per me con la vera sintassi dell'URL, ad esempio git+ssh://git@git.mydomain.com/Username/Repository(nota / che separa host e nome utente). Questa potrebbe essere una cosa specifica del filato, forse l'esempio suggerito funziona con npm
Ivo van der Wijk

1
il token di distribuzione funziona alla grande. <token-name>nell'esempio sembra gitlab+deploy-token-17034, non è il nome arbitrario che assegni al token.
Mr5o1

26

Invece di git://, usa git+ssh://e npm dovrebbe fare la cosa giusta.


5
Risposta dal creatore di npm stesso 👆
Dmitry Parzhitsky

Ottengoundefined ls-remote <url>
chovy il

git + ssh: git@git.mydomain.com/Username/Repositor, rimuovi // per me funziona. Thx
AliasCocoa

22

Aggiornare

Come menzionato da @felix nei commenti (grazie a @felix) l'utilizzo deploy tokenè molto più rilevante per leggere un registro privato su gitlab. In questo modo il token viene compromesso, l'attaccante può semplicemente leggere quel repository e non può apportare modifiche.

Creazione di un token di distribuzione

  1. Accedi al tuo GitLabaccount.
  2. Vai al progetto per il quale desideri creare i token di distribuzione.
  3. Vai a Impostazioni> Repository.
  4. Fare clic sulla Expandsezione Distribuisci token.
  5. Scegli un nome e, facoltativamente, una data di scadenza per il token.
  6. Scegli gli ambiti desiderati. <= selezionaread_repository
  7. Fare clic su Crea token di distribuzione.
  8. Salva il token di distribuzione in un luogo sicuro. Una volta che esci o aggiorni la pagina, non potrai più accedervi.

Vecchia risposta

Vai a User Settings > Access Tokense creane uno nuovo access tokencon il read_registrypermesso.

inserisci qui la descrizione dell'immagine

Copia generata token, ne abbiamo bisogno per il nostro package.jsonfile.

inserisci qui la descrizione dell'immagine

Ora package.jsonaggiungi dependencyquanto segue:

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

Sostituisci Xaqroncon il tuo nome utente e tokencon il token generato. È possibile specificare branche tagalla fine dell'URL tramite #{branch|tag}.

Nota: poiché il token di accesso si trova in package.jsonchiunque abbia accesso a questo progetto può leggere il repository, quindi presumo che il tuo progetto sia privato stesso.


5
L'altro modo è creare un token di distribuzione per quel repository specifico. Quindi non concede l'accesso in lettura a tutti i tuoi repository. "private-module": "git+https://gitlab+deploy-token-username:deploy-token@gitlab.com/you/project",
Chris Sattinger

npm ERR! enoent undefined ls-remote -h -t https://puump:pass@gitlab.com/puump/puump-content.git
chovy

2
@chovy: Install git see
Xaqron

1
Voglio anche sottolineare che se il tuo progetto è all'interno di un gruppo, allora dovresti definire questo "private-module": "git+https://gitlab+deploy-token-username:deploy-token@gitlab.com/group_name/project"your usernamegroup_name
:,

8

Sebbene la domanda riguardi Gitlab, questa domanda è abbastanza ben posizionata nella ricerca su Google, quindi ecco alcune ulteriori informazioni su come risolvere un problema simile che ho avuto con Github.

Per me, solo cambiare l'URL non ha funzionato. Ecco i passaggi che ho dovuto eseguire per risolvere questo problema:

  • git+ssh://git@github.com:owner/repo.git#master
  • Crea una chiave di distribuzione e aggiungila al repository
  • Modifica git config (~/.ssh/config crea il file se non esiste) per forzare l'uso di DeployKey invece della chiave ssh predefinita

Dopo di che l'installazione di npm ha semplicemente funzionato. Tutte le altre opzioni e soluzioni sono dovute all'interruzione dell'installazione di npm


deve essere un errore di battitura. :owner?
chovy

1
cosa ci faccio ~/.ssh/config? Non riesco ancora a concludere con npm / gitlab
chovy

6

Solo per chiunque altro si imbattesse in questo, non sono riuscito a farlo funzionare su HTTPS - sembra che non supporti il ​​collegamento diretto al repository (ad es. https://git.domain.com/user/somerepo.git), Né supporta il .tar, .tar.bzo.zip versioni di archivio.

Sembra funzionare solo con .tar.gz archivio.

Esempio completo (con versione contrassegnata):

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


5

Nessuna delle altre risposte ha funzionato per me per un repository privato gitlab.com ...

Funziona comunque:

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

È solo l'URL clone di git ssh dal campo di input "clone" della pagina del progetto con git+ssh://aggiunto in primo piano.


1
funziona, dato che la tua chiave pubblica ssh è già impostata sull'account gitlab.
lasec0203

3

Per quanto posso dire dove stai sbagliando è il git://protocollo. GitLab supporta solo HTTP (s) e SSH per i cloni. Quindi devi usare uno di quei metodi invece del protocollo git.


3

Per me impostare il package.json come funziona di seguito.

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

Il token si ottiene dalle "Impostazioni profilo - Token di accesso".


Questo ha funzionato anche per me. Sto lavorando dietro un proxy con certificato autofirmato.
Stefano Mozart

questo in realtà ha funzionato per me ma mi chiedo se sia una buona idea lasciare il token nel package.json poiché altri potrebbero usarlo per scrivere? gitlab (almeno nel mio caso) non mi consente di creare un token di accesso di sola lettura ma solo uno di accesso completo. cosa ne pensi?
cancerbero

Nota: GitLab 10.7 (rilasciato nell'aprile 2018) ha aggiunto "Deploy Tokens" a livello di progetto. Questi dovrebbero essere usati al posto di un "token di accesso" a livello di utente. link alla documentazione

0

Se si desidera utilizzare una variabile di ambiente che contiene il token invece di un token hardcoded nell'URL, ho trovato una soluzione anche abbastanza complessa. Useremo la GIT_ASKPASSvariabile d'ambiente per ottenere la password da uno script bash, questo script farà l'eco di una variabile d'ambiente. Per superare npm che passa solo variabili di ambiente GIT specifiche, utilizzeremoGIT_SSH come intermediario.

Quindi, dato che git_pass_env.shcontiene echo $GIT_SSHpossiamo semplicemente chiamare:

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

Per un progetto di esempio con docker e docker-compose vedere il mio repository qui .

Diagramma di flusso delle variabili ambientali:

Diagramma di flusso


0

Gitlab ora ha un registro dei pacchetti in cui è possibile creare, distribuire e ospitare pacchetti npm. Con i repository privati, è possibile fornire un controllo dettagliato degli accessi sui contenuti del repository e sui pacchetti.

I pacchetti NPM possono essere installati da repository Gitlab privati ​​aggiungendo un .npmrcfile a fianco package.json. Maggiori info qui . Anche se diventa complicato quando si utilizzano più token di distribuzione per diversi repository nella stessa base di codice.

Con Gitlab è possibile accedere al .tgzfile del pacchetto direttamente con HTTPS e distribuire il token . Aggiungi semplicemente la dipendenza del progetto in questo modo:

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

@ foo / bar è presente due volte nell'URL. @foo è l'ambito del progetto e bar è il nome del modulo e 1.0.0 è il nome del modulo. project-id (8 cifre numeriche) è l'ID del progetto Gitlab, che può essere visto dalla pagina del progetto sotto il nome. È anche possibile omettere @foo dal nome del modulo (ma non dal collegamento).

L'utilizzo di più moduli con lo stesso ambito e diversi token di distribuzione rende sicura la gestione dei repository privati. Inoltre, i token di distribuzione possono avere accesso solo a package registryciò significa che l'utente finale non sarà in grado di accedere al codice sorgente completo dai repository.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.