Instalar el módulo npm desde el repositorio privado de gitlab

97

Estamos usando GitLab para nuestro proyecto privado. Hay algunas bibliotecas bifurcadas de github, que queremos instalar como módulo npm. Instalar ese módulo directamente desde npm está bien y, por ejemplo, esto:

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

... también funciona correctamente, pero al hacer lo mismo para GitLab, solo cambiar el dominio me da este error.

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

Desde la interfaz web de GitLab, tengo esta URL [email protected]:library/grunt-stylus-sprite.git. Ejecutando esto en su contra npm install, intenta instalar el gitmódulo desde el registro npm.

Sin embargo, el uso de URL: de [email protected]:library/grunt-stylus-sprite.gitrepente me pide la contraseña. Mi clave SSH no incluye frase de contraseña, así que supongo que no pudo cargar esa clave. ¿Quizás hay alguna configuración que me he perdido? La clave se encuentra en la ubicación estándar de mi directorio personal con el nombre "id_rsa".

Estoy en Windows 7 x64.

ACTUALIZAR

Desde NPM v3 hay soporte incorporado para GitLab y otras fuentes (BitBucket, Gist), desde donde puede instalar paquetes. Desafortunadamente, solo funciona para los públicos, por lo que no está exactamente relacionado con esto, pero algunos pueden encontrarlo útil.

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

Consulte la documentación: https://docs.npmjs.com/cli/install

FredyC
fuente
1
entonces, ¿cuál es la URL de gitlab real que uso? Veo que <placeholders>probé varias variaciones y todavía dice que no se encontró el proyecto.
chovy
1
$ npm i -S git+ssh://[email protected]/org/repo.gitno funciona
chovy

Respuestas:

157

Tiene los siguientes métodos para conectarse a un repositorio privado de gitlab

Con SSH

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

Con HTTPS

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

Con HTTPS e implementa token

git+https://<token-name>:<token>@gitlab.com/Username/Repository#{branch|tag}
Sidhuko
fuente
Sí, eso es más o menos lo que he descubierto. Incluso puede especificar una rama o etiqueta como Repository#1.2.3. Cambiaré la marca de respuesta ya que es más precisa.
FredyC
1
@jamessidhu No estoy seguro, pero me está pidiendo una contraseña incluso con SSH. Al dar la contraseña me está dando un error. ¿Alguna idea de cómo solucionarlo?
codesnooker
@codesnooker ¿Ha configurado una clave SSH en Gitlab ? Si las claves no están autorizadas entre su máquina y el control remoto, se utilizará de forma predeterminada una contraseña como el acceso a un servidor.
sidhuko
5
En realidad, esto solo funciona para mí con una verdadera sintaxis de URL, por ejemplo git+ssh://[email protected]/Username/Repository(tenga en cuenta el / que separa el host y el nombre de usuario). Esto puede ser algo específico del hilo, quizás el ejemplo sugerido funcione con npm
Ivo van der Wijk
1
Implementar token funciona muy bien. <token-name>en el ejemplo parece gitlab+deploy-token-17034que no es el nombre arbitrario que asigna al token.
Mr5o1
26

En lugar de git://, use git+ssh://y npm debería hacer lo correcto.

isaacs
fuente
5
Respuesta del propio creador de npm 👆
Dmitry Parzhitsky
Tengoundefined ls-remote <url>
chovy
git + ssh: [email protected]/Username/Repositor, remove // ​​funciona para mí. Thx
AliasCocoa
22

Actualizar

Como @felix mencionó en los comentarios (gracias @felix), el uso deploy tokenes mucho más relevante para leer un registro privado en gitlab. De esta manera, el token está comprometido, el atacante solo puede leer ese repositorio y no puede realizar cambios.

Creación de un token de implementación

  1. Inicie sesión en su GitLabcuenta.
  2. Vaya al proyecto para el que desea crear Deploy Tokens.
  3. Vaya a Configuración> Repositorio.
  4. Haga clic en Expand sección Implementar tokens.
  5. Elija un nombre y, opcionalmente, una fecha de vencimiento para el token.
  6. Elija los alcances deseados. <= seleccionarread_repository
  7. Haga clic en Crear token de implementación.
  8. Guarde el token de implementación en un lugar seguro. Una vez que salga o actualice la página, no podrá volver a acceder a ella.

Respuesta antigua

Vaya User Settings > Access Tokensy cree uno nuevo access tokencon read_registrypermiso.

ingrese la descripción de la imagen aquí

Copia generada token, la necesitamos para nuestro package.jsonarchivo.

ingrese la descripción de la imagen aquí

Ahora package.jsonagregue lo dependencysiguiente:

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

Reemplácelo Xaqroncon su nombre de usuario y tokencon el token generado. Puede especificar branchy tagal final de la URL mediante #{branch|tag}.

Nota: Dado que el token de acceso se encuentra en package.jsoncualquier persona que tenga acceso a este proyecto puede leer el repositorio, así que supongo que su proyecto es privado.

Xaqron
fuente
5
La otra forma es crear un Deploy Token para ese repositorio específico. Entonces no otorga acceso de lectura para todos sus repositorios. "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: git Ver instalación
Xaqron
1
También quiero señalar que si su proyecto está dentro de un grupo, entonces debe definir esto:, "private-module": "git+https://gitlab+deploy-token-username:[email protected]/group_name/project"entonces en lugar de your username, debe definir group_nameantes del nombre del proyecto
sfarzoso
8

Aunque la pregunta es sobre Gitlab, esta pregunta está bastante bien clasificada en la búsqueda de Google, por lo que aquí hay más información sobre cómo solucionar un problema similar que tuve con Github.

Para mí, solo cambiar la URL no lo hizo funcionar. Estos son los pasos que tuve que seguir para solucionar este problema:

  • git+ssh://[email protected]:owner/repo.git#master
  • Cree una clave de implementación y agréguela al repositorio
  • Edite la configuración de git ( ~/.ssh/configcree el archivo si no existe) para forzar el uso de DeployKey en lugar de la clave ssh predeterminada

Después de eso, la instalación de npm simplemente funcionó. Todas las demás opciones y soluciones resultaron de la interrupción de la instalación de npm

Sephy
fuente
eso tiene que ser un error tipográfico. :owner?
Chovy
1
¿Qué hago con el ~/.ssh/config? Todavía no recibo a través de la NPM / gitlab
Chovy
6

Solo para cualquier otra persona que se encuentre con esto, no pude hacer que funcione en HTTPS en absoluto; parece que no admite el enlace directo al repositorio (por ejemplo https://git.domain.com/user/somerepo.git), ni admite el .tar, .tar.bzo.zip las versiones de archivo.

Solo parece funcionar con el .tar.gz archivo.

Ejemplo completo (con versión etiquetada):

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

Chrisf
fuente
5

Ninguna de las otras respuestas me funcionó para un repositorio privado de gitlab.com ...

Sin embargo, esto funciona:

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

Es solo la URL de clonación de git ssh del campo de entrada "clon" de la página del proyecto que se git+ssh://agrega al frente.

chovy
fuente
1
esto funciona, dado que su clave pública ssh ya está configurada en la cuenta de gitlab.
lasec0203
3

Por lo que puedo decir, lo que te equivocas es el git://protocolo. GitLab solo admite HTTP (s) y SSH para clones. Entonces debes usar uno de esos métodos en lugar del protocolo git.

Sam Gleske
fuente
3

Para mí, configure el package.json como funciona a continuación.

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

El token se obtiene de su "Configuración de perfil - Token de acceso".

shentaoy
fuente
Esto funcionó para mí también. Estoy trabajando detrás de un proxy con certificado autofirmado.
Stefano Mozart
esto realmente funcionó para mí, pero me pregunto si es una buena idea dejar el token en el package.json ya que otros podrían usarlo para escribir. gitlab (al menos en mi caso) no me permite crear un token de acceso de solo lectura, sino solo uno de acceso completo. ¿Qué piensas?
cancerbero
Nota: GitLab 10.7 (lanzado en abril de 2018) agregó "Deploy Tokens" a nivel de proyecto. Estos deben usarse en lugar de un "Token de acceso" a nivel de usuario. enlace de documentos
0

Si desea utilizar una variable de entorno que contenga el token en lugar de un token codificado en la URL, se me ocurrió una solución incluso bastante compleja. Usaremos la GIT_ASKPASSvariable de entorno para obtener la contraseña de un script bash, este script hará eco de una variable de entorno. Para superar npm pasando solo variables de entorno GIT específicas que usaremos GIT_SSHcomo intermediario.

Entonces, dado que git_pass_env.shcontiene echo $GIT_SSH, podemos simplemente llamar:

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

Para un proyecto de ejemplo con docker y docker-compose, vea mi repositorio aquí .

Diagrama de flujo de variables ambientales:

diagrama de flujo

YoniXw
fuente
0

Gitlab ahora tiene un registro de paquetes donde es posible construir, implementar y alojar paquetes npm. Con los repositorios privados, es posible proporcionar un control de acceso detallado sobre el contenido del repositorio y los paquetes.

Los paquetes NPM se pueden instalar desde repositorios privados de Gitlab agregando un .npmrcarchivo al lado package.json. Más info aquí . Aunque se complica cuando se utilizan varios tokens de implementación para diferentes repositorios en la misma base de código.

Con Gitlab es posible acceder al paquete .tgz archivo directamente con HTTPS e implementar el token . Simplemente agregue la dependencia del proyecto de esta manera:

"@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á presente dos veces en la URL. @foo es el alcance del proyecto y bar es el nombre del módulo y 1.0.0 es el nombre del módulo. project-id (numérico de 8 dígitos) es el ID del proyecto de Gitlab, que se puede ver en la página del proyecto debajo del nombre. Incluso es posible omitir @foo del nombre del módulo (pero no del enlace).

El uso de varios módulos con el mismo alcance y diferentes tokens de implementación hace que la administración de repositorios privados sea segura. Además, los tokens de implementación solo pueden tener acceso, lo package registryque significa que el usuario final no podrá acceder al código fuente completo de los repositorios.

Palash Bansal
fuente