Zainstaluj moduł npm z prywatnego repozytorium gitlab

98

Używamy GitLab do naszego prywatnego projektu. Istnieje kilka rozwidlonych bibliotek z github, które chcemy zainstalować jako moduł npm. Zainstalowanie tego modułu bezpośrednio z npm jest ok i na przykład to:

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

... też działa poprawnie, ale robiąc to samo dla GitLab, po prostu zmiana domeny powoduje ten błąd.

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

Z interfejsu internetowego GitLab mam ten adres URL [email protected]:library/grunt-stylus-sprite.git. Uruchomienie tego przeciwko npm installpróbuje zainstalować gitmoduł z rejestru npm.

Jednak używając URL: [email protected]:library/grunt-stylus-sprite.gitnagle pyta mnie o hasło. Mój klucz SSH nie zawiera hasła, więc zakładam, że nie był w stanie załadować tego klucza. Może jest jakaś konfiguracja, której przegapiłem? Klucz znajduje się w standardowej lokalizacji w moim katalogu domowym o nazwie "id_rsa".

Jestem na Windows 7 x64.

AKTUALIZACJA

Od NPM v3 istnieje wbudowana obsługa GitLab i innych źródeł (BitBucket, Gist), z których można instalować pakiety. Niestety działa tylko w przypadku publicznych, więc nie jest to dokładnie związane, ale niektórzy mogą uznać to za przydatne.

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

Zapoznaj się z dokumentacją: https://docs.npmjs.com/cli/install

FredyC
źródło
1
więc jaki jest rzeczywisty adres URL gitlab, którego używam? Po prostu widzę, że <placeholders>wypróbowałem kilka odmian i nadal jest napisane, że nie znaleziono projektu.
chovy
1
$ npm i -S git+ssh://[email protected]/org/repo.gitnie działa
chovy

Odpowiedzi:

157

Masz następujące metody łączenia się z prywatnym repozytorium gitlab

Dzięki SSH

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

Z HTTPS

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

Z HTTPS i wdrażaj token

git+https://<token-name>:<token>@gitlab.com/Username/Repository#{branch|tag}
sidhuko
źródło
Tak, właśnie to odkryłem. Możesz nawet określić gałąź lub tag, np Repository#1.2.3. Zmienię zaznaczenie odpowiedzi, ponieważ jest to dokładniejsze.
FredyC
1
@jamessidhu Nie jestem pewien, ale pyta mnie o hasło nawet z SSH. Podanie hasła daje mi błąd. Masz jakiś pomysł, jak to rozwiązać?
Codesnooker
@codesnooker Czy skonfigurowałeś klucz SSH w Gitlab ? Jeśli klucze nie są autoryzowane między twoim komputerem a pilotem, domyślnie będzie to hasło, takie jak dostęp do serwera.
sidhuko
5
To faktycznie działa tylko dla mnie z prawdziwą składnią adresu URL, np. git+ssh://[email protected]/Username/Repository(Zwróć uwagę na / oddzielający hosta i nazwę użytkownika). Może to być sprawa specyficzna dla włóczki, być może sugerowany przykład działa z npm
Ivo van der Wijk
1
Wdrożenie tokena działa świetnie. <token-name>w przykładzie wygląda na to gitlab+deploy-token-17034, że nie jest to dowolna nazwa, którą przypisujesz do tokena.
Mr5o1
26

Zamiast git://, użyj git+ssh://i npm powinny zrobić właściwą rzecz.

isaacs
źródło
5
Odpowiedź od samego twórcy npm 👆
Dima Parzhitsky
Dostajęundefined ls-remote <url>
chovy
git + ssh: [email protected]/Username/Repositor, usuń // to działa dla mnie. Thx
AliasCocoa
23

Aktualizacja

Jak @felix wspomniał w komentarzach (dzięki @felix), używanie deploy tokenjest znacznie bardziej odpowiednie do czytania prywatnego rejestrugitlab . W ten sposób token jest zagrożony, atakujący może po prostu odczytać to repozytorium i nie może wprowadzać zmian.

Tworzenie tokenu wdrażania

  1. Zaloguj się do swojego GitLab konto.
  2. Przejdź do projektu, dla którego chcesz utworzyć tokeny wdrażania.
  3. Wybierz Ustawienia> Repozytorium.
  4. Kliknij Expand sekcję Rozmieść tokeny.
  5. Wybierz nazwę i opcjonalnie datę ważności tokena.
  6. Wybierz żądane zakresy. <= wybierzread_repository
  7. Kliknij Utwórz token wdrożenia.
  8. Zapisz token wdrożenia w bezpiecznym miejscu. Po opuszczeniu lub odświeżeniu strony nie będzie można ponownie uzyskać do niej dostępu.

Stara odpowiedź

Idź User Settings > Access Tokensi utwórz nowy access tokenza read_registryzgodą.

wprowadź opis obrazu tutaj

Wygenerowana kopia token, potrzebujemy jej do naszego package.jsonpliku.

wprowadź opis obrazu tutaj

Teraz package.jsondodaj, dependencyjak poniżej:

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

Zastąp Xaqronswoją nazwą użytkownika i tokenwygenerowanym tokenem. Możesz określić adres URL branchi tagna końcu adresu #{branch|tag}.

Uwaga: ponieważ token dostępu znajduje się w package.jsonkażdym, kto ma dostęp do tego projektu, może odczytać repozytorium, więc zakładam, że twój projekt jest prywatny.

Xaqron
źródło
5
Innym sposobem jest utworzenie tokenu wdrażania dla tego konkretnego repozytorium. Wtedy nie przyznaje dostępu do odczytu dla wszystkich repozytoriów. "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: Zainstaluj git zobacz
Xaqron
2
Chcę również zaznaczyć, że jeśli twój projekt jest wewnątrz grupy, powinieneś zdefiniować to: "private-module": "git+https://gitlab+deploy-token-username:[email protected]/group_name/project"więc zamiast tego your usernamemusisz zdefiniować group_nameprzed nazwą projektu
sfarzoso
8

Chociaż pytanie dotyczy Gitlab, to pytanie jest dość dobrze sklasyfikowane w wyszukiwarce Google, więc tutaj jest więcej informacji o tym, jak rozwiązać podobny problem, który otrzymałem z Github.

Dla mnie tylko zmiana adresu URL nie sprawiła, że ​​to zadziałało. Oto kroki, które musiałem podjąć, aby to naprawić:

  • git+ssh://[email protected]:owner/repo.git#master
  • Utwórz klucz wdrażania i dodaj go do repozytorium
  • Edytuj konfigurację git (~/.ssh/config utwórz plik, jeśli nie istnieje), aby wymusić użycie DeployKey zamiast domyślnego klucza ssh

Po tym instalacja npm po prostu zadziałała. Wszystkie inne opcje i rozwiązania spowodowały zerwanie instalacji npm

Sephy
źródło
to musi być literówka. :owner?
chovy
1
Co mam zrobić z ~/.ssh/config? Nadal nie mogę
połączyć
6

Wystarczy dla każdego, kto natyka się na to, nie mogłem dostać pracy nad HTTPS w ogóle - wydaje się nie obsługuje bezpośrednie połączenie z repo (np https://git.domain.com/user/somerepo.git), ani nie wspierają .tar, .tar.bzlub .zipwersje archiwalne.

Wydaje się, że działa tylko z .tar.gzarchiwum.

Pełny przykład (z oznaczoną wersją):

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

chrisf
źródło
5

Żadna z innych odpowiedzi nie działała dla mnie w prywatnym repozytorium gitlab.com ...

Działa to jednak:

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

Jest to po prostu adres URL klonowania git ssh z pola wejściowego „clone” strony projektu z git+ssh://dodaniem na początku.

chovy
źródło
1
to działa, biorąc pod uwagę, że Twój klucz publiczny ssh jest już skonfigurowany na koncie gitlab.
lasec0203
3

O ile wiem, dokąd zmierzasz źle, to git://protokół. GitLab obsługuje tylko protokoły HTTP i SSH dla klonów. Musisz więc użyć jednej z tych metod zamiast protokołu git.

Sam Gleske
źródło
3

U mnie ustaw plik package.json jak poniżej działa.

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

Token można pobrać z „Ustawień profilu - Token dostępu”.

shentaoy
źródło
U mnie też to zadziałało. Pracuję za proxy z certyfikatem z podpisem własnym.
Stefano Mozart
to faktycznie zadziałało dla mnie, ale zastanawiam się, czy dobrym pomysłem jest pozostawienie tokena w pliku package.json, ponieważ inni mogą go używać do pisania? gitlab (przynajmniej w moim przypadku) nie pozwala mi na utworzenie tokena dostępu tylko do odczytu, a jedynie pełnego dostępu. co myślisz?
cancerbero
Uwaga: GitLab 10.7 (wydany w kwietniu 2018 r.) Dodał „Wdrażanie tokenów” na poziomie projektu. Należy ich używać zamiast „tokena dostępu” na poziomie użytkownika. link do dokumentów
0

Jeśli chcesz użyć zmiennej środowiskowej przechowującej token zamiast zakodowanego na stałe tokena w adresie URL, wymyśliłem rozwiązanie, nawet trudne, dość złożone. Użyjemy GIT_ASKPASSzmiennej środowiskowej, aby uzyskać hasło ze skryptu bash, ten skrypt będzie odzwierciedlał zmienną środowiskową. Aby przezwyciężyć npm przekazując tylko określone zmienne środowiskowe GIT, użyjemy GIT_SSHjako pośrednik.

Tak więc, podając git_pass_env.shzawartość echo $GIT_SSH, możemy po prostu zadzwonić:

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

Przykładowy projekt z dockerem i docker-compose znajduje się tutaj w moim repozytorium .

Schemat przepływu zmiennych środowiskowych:

schemat przepływu

YoniXw
źródło
0

Gitlab ma teraz rejestr pakietów, w którym można budować, wdrażać i hostować pakiety npm. W przypadku repozytoriów prywatnych można zapewnić szczegółową kontrolę dostępu do zawartości repozytorium i pakietów.

Pakiety NPM można zainstalować z prywatnych repozytoriów Gitlab, dodając .npmrcplik obok package.json. Więcej informacji tutaj . Chociaż staje się to skomplikowane, gdy używa się wielu tokenów wdrażania dla różnych repozytoriów w tej samej bazie kodu.

Dzięki Gitlab można uzyskać dostęp do .tgzpliku pakietu bezpośrednio przez HTTPS i wdrożyć token . Po prostu dodaj zależność projektu w następujący sposób:

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

@ foo / bar występuje dwukrotnie w adresie URL. @foo to zakres projektu, a pasek to nazwa modułu, a 1.0.0 to nazwa modułu. identyfikator projektu (8-cyfrowy numer) to identyfikator projektu Gitlab, który można zobaczyć na stronie projektu pod nazwą. Możliwe jest nawet pominięcie @foo w nazwie modułu (ale nie w linku).

Korzystanie z wielu modułów z tym samym zakresem i różnymi tokenami wdrażania zapewnia bezpieczeństwo zarządzania prywatnymi repozytoriami. Ponadto tokeny wdrożeniowe mogą mieć tylko dostęp, package registryco oznacza, że ​​użytkownik końcowy nie będzie mógł uzyskać dostępu do pełnego kodu źródłowego z repozytoriów.

Palash Bansal
źródło