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 git@git.domain.com:library/grunt-stylus-sprite.git. Executando isso contra npm installele tenta instalar o gitmódulo do registro npm.

No entanto, usar URL: de git+ssh@git.domain.com: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


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://git@gitlab.com/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://git@git.mydomain.com:Username/Repository#{branch|tag}
git+ssh://git@git.mydomain.com/Username/Repository#{branch|tag}

Com HTTPS

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

Com HTTPS e implantar token

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

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://git@git.mydomain.com/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.


5
Resposta do próprio criador do npm 👆
Dmitry Parzhitsky

Eu entendoundefined ls-remote <url>
chovy

git + ssh: git@git.mydomain.com/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:token@gitlab.com/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.


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: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: 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:deploy-token@gitlab.com/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://git@github.com: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


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


5

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

No entanto, isso funciona:

npm i -S git+ssh://git@gitlab.com:<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.


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.


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".


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


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.