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 git@git.domain.com:library/grunt-stylus-sprite.git. Uruchomienie tego przeciwko npm installpróbuje zainstalować gitmoduł z rejestru npm.

Jednak używając URL: git+ssh@git.domain.com: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


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://git@gitlab.com/org/repo.gitnie działa
chovy

Odpowiedzi:


157

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

Dzięki SSH

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

Z HTTPS

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

Z HTTPS i wdrażaj token

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

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


5
Odpowiedź od samego twórcy npm 👆
Dima Parzhitsky

Dostajęundefined ls-remote <url>
chovy

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


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


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


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


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.


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


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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.