Instale o módulo npm do repositório privado gitlab

97

Estamos usando o GitLab para nosso projeto privado. Existem algumas bibliotecas bifurcadas do github, que queremos instalar como módulo npm. A instalação desse módulo diretamente do npm está ok e, por exemplo:

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

... funciona corretamente também, mas fazendo o mesmo para GitLab, apenas mudar de domínio me dá esse erro.

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

Na interface da web do GitLab, tenho este URL [email protected]:library/grunt-stylus-sprite.git. Executando isso contra npm installele tenta instalar o gitmódulo do registro npm.

No entanto, usar URL: de [email protected]:library/grunt-stylus-sprite.gitrepente está me pedindo a senha. Minha chave SSH não inclui senha, então presumo que não foi possível carregar essa chave. Talvez haja alguma configuração para que eu tenha esquecido? A chave está localizada no local padrão em meu diretório inicial com o nome "id_rsa".

Estou no Windows 7 x64.

ATUALIZAR

Desde o NPM v3, há suporte integrado para GitLab e outras fontes (BitBucket, Gist), de onde você pode instalar pacotes. Infelizmente, ele funciona apenas para os públicos, então não está exatamente relacionado a isso, mas alguns podem achar útil.

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

Confira a documentação: https://docs.npmjs.com/cli/install

FredyC
fonte
1
então, qual é o verdadeiro url do gitlab que uso? Acabei de ver <placeholders>que tentei várias variações e ainda diz que projeto não encontrado.
chovy
1
$ npm i -S git+ssh://[email protected]/org/repo.gitnão funciona
chovy

Respostas:

157

Você tem os seguintes métodos para se conectar a um repositório gitlab privado

Com SSH

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

Com HTTPS

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

Com HTTPS e implantar token

git+https://<token-name>:<token>@gitlab.com/Username/Repository#{branch|tag}
Sidhuko
fonte
Sim, isso é basicamente o que descobri. Você pode até especificar um branch ou tag como Repository#1.2.3. Vou mudar a marca de resposta, pois é mais precisa.
FredyC de
1
@jamessidhu Eu não tenho certeza, mas está me pedindo senha mesmo com SSH. Ao passar a senha ele está me dando erro. Alguma ideia de como resolver isso?
codesnooker
@codesnooker Você configurou uma chave SSH no Gitlab ? Se as chaves não forem autorizadas entre sua máquina e o controle remoto, o padrão será uma senha, como o acesso a um servidor.
sidhuko
5
Na verdade, isso só funciona para mim com a verdadeira sintaxe de URL, por exemplo git+ssh://[email protected]/Username/Repository(observe / separando host e nome de usuário). Isso pode ser uma coisa específica do fio, talvez o exemplo sugerido funcione com npm
Ivo van der Wijk
1
implantar token funciona muito bem. <token-name>no exemplo parece gitlab+deploy-token-17034, não é o nome arbitrário que você atribui ao token.
Mr5o1
26

Em vez de git://, use git+ssh://e npm deve fazer a coisa certa.

isaacs
fonte
5
Resposta do próprio criador do npm 👆
Dmitry Parzhitsky
Eu entendoundefined ls-remote <url>
chovy
git + ssh: [email protected]/Username/Repositor, remova // funciona para mim. Thx
AliasCocoa
22

Atualizar

Como @felix mencionou nos comentários (obrigado @felix), usar deploy tokené muito mais relevante para ler um registro privado no gitlab. Dessa forma, o token fica comprometido, o invasor pode apenas ler o repositório e não pode fazer alterações.

Criação de um token de implantação

  1. Faça login em sua GitLabconta.
  2. Vá para o projeto para o qual deseja criar Tokens de implantação.
  3. Vá para Configurações> Repositório.
  4. Clique na Expandseção Implementar Tokens.
  5. Escolha um nome e, opcionalmente, uma data de validade para o token.
  6. Escolha os escopos desejados. <= selecionarread_repository
  7. Clique em Criar token de implantação.
  8. Salve o token de implantação em um lugar seguro. Depois de sair ou atualizar a página, você não poderá acessá-la novamente.

Resposta antiga

Vá para User Settings > Access Tokense crie um novo access tokencom read_registrypermissão.

insira a descrição da imagem aqui

Cópia gerada token, precisamos dela para nosso package.jsonarquivo.

insira a descrição da imagem aqui

Agora package.jsonadicione o dependencyseguinte:

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

Substitua Xaqronpelo seu nome de usuário e tokenpelo token gerado. Você pode especificar branche tagno final do url por #{branch|tag}.

Nota: Como o token de acesso está localizado em package.jsonqualquer pessoa que tenha acesso a este projeto pode ler o repositório, então presumo que seu projeto seja privado.

Xaqron
fonte
5
A outra maneira é criar um token de implantação para esse repositório específico. Então, ele não concede acesso de leitura para todos os seus repositórios. "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: Instalar git veja
Xaqron
1
Também quero salientar que se o seu projeto estiver dentro de um grupo, você deve definir isso "private-module": "git+https://gitlab+deploy-token-username:[email protected]/group_name/project"your usernamegroup_name
:,
8

Embora a pergunta seja sobre o Gitlab, ela está muito bem classificada na pesquisa do Google, então aqui estão mais algumas informações sobre como consertar um problema semelhante que tive com o Github.

Para mim, só mudar o url não funcionou. Aqui estão as etapas que tive que seguir para corrigir isso:

  • git+ssh://[email protected]:owner/repo.git#master
  • Crie uma chave de implantação e adicione-a ao repo
  • Edite git config ( ~/.ssh/configcrie o arquivo se ele não existir) para forçar o uso da DeployKey em vez da chave ssh padrão

Depois disso, a instalação do npm simplesmente funcionou. Todas as outras opções e soluções resultaram da interrupção da instalação do npm

Sephy
fonte
isso tem que ser um erro de digitação. :owner?
chovy
1
o que eu faço com ~/.ssh/config? Ainda não estou conseguindo terminar com npm / gitlab
chovy
6

Apenas para qualquer outra pessoa que se depara com isso, eu não poderia fazê-lo funcionar através de HTTPS em tudo - parece que não suporta o link direto para o repo (por exemplo https://git.domain.com/user/somerepo.git), nem apoiar o .tar, .tar.bzou .zipversões de arquivo.

Parece funcionar apenas com o .tar.gzarquivo.

Exemplo completo (com versão marcada):

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

chrisf
fonte
5

Nenhuma das outras respostas funcionou para mim para um repositório gitlab.com privado ...

No entanto, isso funciona:

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

É apenas o url do clone do git ssh do campo de entrada "clone" da página do projeto git+ssh://adicionado à frente dele.

chovy
fonte
1
isso funciona, visto que sua chave pública ssh já está configurada na conta gitlab.
lasec0203
3

Pelo que eu posso dizer onde você está errado é o git://protocolo. O GitLab só oferece suporte a HTTP (s) e SSH para clones. Portanto, você deve usar um desses métodos em vez do protocolo git.

Sam Gleske
fonte
3

Para mim, defina o package.json como funciona abaixo.

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

O token é obtido em "Configurações do perfil - Token de acesso".

shentaoy
fonte
Isso funcionou para mim também. Estou trabalhando por trás de um proxy com certificado autoassinado.
Stefano Mozart
isso realmente funcionou para mim, mas eu me pergunto se é uma boa ideia deixar o token no package.json, visto que outros podem usá-lo para escrever? O gitlab (pelo menos no meu caso) não está permitindo que eu crie um token de acesso somente leitura, mas apenas um de acesso total. O que você acha?
cancerbero
Observação: GitLab 10.7 (lançado em abril de 2018) adicionou "Implantar tokens" no nível do projeto. Eles devem ser usados ​​em vez de um "Token de acesso" no nível do usuário. docs link
0

Se você quiser usar uma variável de ambiente contendo o token em vez de um token codificado na URL, eu vim com uma solução ainda bastante complexa. Usaremos a GIT_ASKPASSvariável de ambiente para obter a senha de um script bash, esse script ecoará uma variável de ambiente. Para superar o npm, passando apenas variáveis ​​de ambiente GIT específicas, usaremos GIT_SSHcomo intermediário.

Então, dado git_pass_env.shcontendo echo $GIT_SSH, podemos apenas chamar:

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

Para um projeto de exemplo com docker e docker-compose, veja meu repo aqui .

Diagrama de fluxo de variáveis ​​de ambiente:

diagrama de fluxo

YoniXw
fonte
0

Gitlab agora possui um registro de pacote onde é possível construir, implantar e hospedar pacotes npm. Com repositórios privados, é possível fornecer controle de acesso refinado sobre o conteúdo do repositório e os pacotes.

Os pacotes NPM podem ser instalados de repositórios Gitlab privados, adicionando um .npmrcarquivo ao lado package.json. Mais informações aqui . Embora seja complicado usar vários tokens de implantação para diferentes repositórios na mesma base de código.

Com o Gitlab é possível acessar o .tgzarquivo do pacote diretamente com HTTPS e implantar o token . Basta adicionar a dependência do projeto como esta:

"@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 duas vezes no URL. @foo é o escopo do projeto e bar é o nome do módulo e 1.0.0 é o nome do módulo. project-id (numérico de 8 dígitos) é o ID do projeto Gitlab, que pode ser visto na página do projeto sob o nome. É possível até omitir @foo do nome do módulo (mas não do link).

Usar vários módulos com o mesmo escopo e diferentes tokens de implantação torna seguro o gerenciamento de repositórios privados. Além disso, os tokens de implantação só podem ter acesso package registry, o que significa que o usuário final não será capaz de acessar o código-fonte completo dos repositórios.

Palash Bansal
fonte