Cài đặt mô-đun npm từ kho lưu trữ riêng gitlab


97

Chúng tôi đang sử dụng GitLab cho dự án riêng tư của mình. Có một số thư viện fork từ github mà chúng tôi muốn cài đặt dưới dạng mô-đun npm. Cài đặt mô-đun đó trực tiếp từ npm là được và ví dụ như sau:

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

... cũng hoạt động chính xác, nhưng làm tương tự với GitLab, chỉ cần thay đổi miền là tôi gặp lỗi này.

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

Từ giao diện web của GitLab, tôi có URL này git@git.domain.com:library/grunt-stylus-sprite.git. Chạy điều này chống lại npm installnó cố gắng cài đặt gitmô-đun từ sổ đăng ký npm.

Tuy nhiên, sử dụng URL: git+ssh@git.domain.com:library/grunt-stylus-sprite.gitđột nhiên hỏi tôi mật khẩu. Khóa SSH của tôi không bao gồm cụm mật khẩu, vì vậy tôi cho rằng nó không thể tải khóa đó. Có lẽ có một số cấu hình cho mà tôi đã bỏ lỡ? Key nằm ở vị trí chuẩn trong danh bạ chính của tôi với tên "id_rsa".

Tôi đang sử dụng Windows 7 x64.

CẬP NHẬT

Vì NPM v3 có hỗ trợ tích hợp cho GitLab và các nguồn khác (BitBucket, Gist), từ đó bạn có thể cài đặt các gói. Thật không may, nó chỉ hoạt động cho những người công khai nên nó không liên quan chính xác đến vấn đề này, nhưng một số người có thể thấy nó hữu ích.

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

Kiểm tra tài liệu: https://docs.npmjs.com/cli/install


1
vậy url gitlab thực sự mà tôi sử dụng là gì? Tôi chỉ thấy <placeholders>tôi đã thử một số biến thể và nó vẫn thông báo không tìm thấy dự án.
chovy

1
$ npm i -S git+ssh://git@gitlab.com/org/repo.gitkhông hoạt động
chovy

Câu trả lời:


157

Bạn có các phương pháp sau để kết nối với kho lưu trữ gitlab riêng tư

Với SSH

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

Với HTTPS

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

Với HTTPS và triển khai mã thông báo

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

Vâng, đó là khá nhiều những gì tôi đã tìm ra. Bạn thậm chí có thể chỉ định chi nhánh hoặc thẻ như thế nào Repository#1.2.3. Tôi sẽ thay đổi câu trả lời đánh dấu vì điều này chính xác hơn.
FredyC

1
@jamessidhu Tôi không chắc nhưng nó hỏi tôi mật khẩu ngay cả với SSH. Khi cung cấp mật khẩu, nó đang cho tôi lỗi. Bất kỳ ý tưởng làm thế nào để giải quyết nó?
bi da

@codesnooker Bạn đã thiết lập khóa SSH trong Gitlab chưa? Nếu các khóa không được ủy quyền giữa máy của bạn và điều khiển từ xa, nó sẽ mặc định có mật khẩu như quyền truy cập vào máy chủ.
sidhuko

5
Điều này thực sự chỉ hoạt động đối với tôi với cú pháp URL đúng, ví dụ: git+ssh://git@git.mydomain.com/Username/Repository(lưu ý / tách máy chủ và tên người dùng). Đây có thể là một điều sợi đặc biệt, có lẽ là ví dụ đề nghị làm việc với NPM
Ivo van der Wijk

1
triển khai mã thông báo hoạt động tốt. <token-name>trong ví dụ có vẻ như gitlab+deploy-token-17034, đó không phải là tên tùy ý bạn gán cho mã thông báo.
Mr5o1 23/09/18

26

Thay vào đó git://, hãy sử dụng git+ssh://và npm nên làm điều đúng đắn.


5
Câu trả lời từ người sáng tạo NPM tự 👆
Dmitry Parzhitsky

Tôi hiểuundefined ls-remote <url>
chovy

git + ssh: git@git.mydomain.com/Username/Repositor, xóa // nó phù hợp với tôi. Thx
AliasCocoa

22

Cập nhật

Như @felix đã đề cập trong nhận xét (cảm ơn @felix), việc sử dụng deploy tokencó liên quan hơn nhiều đến việc đọc sổ đăng ký riêng tư trên gitlab. Theo cách này, mã thông báo bị xâm phạm, kẻ tấn công chỉ có thể đọc kho lưu trữ đó và không thể thực hiện thay đổi.

Tạo mã thông báo triển khai

  1. Đăng nhập vào GitLabtài khoản của bạn .
  2. Chuyển đến dự án bạn muốn tạo Mã thông báo triển khai.
  3. Đi tới Cài đặt> Kho lưu trữ.
  4. Nhấp vào Expandphần Triển khai mã thông báo.
  5. Chọn tên và tùy chọn ngày hết hạn cho mã thông báo.
  6. Chọn phạm vi mong muốn. <= chọnread_repository
  7. Nhấp vào Tạo mã thông báo triển khai.
  8. Lưu mã thông báo triển khai ở nơi an toàn. Sau khi thoát hoặc làm mới trang, bạn sẽ không thể truy cập lại.

Câu trả lời cũ

Di chuyển User Settings > Access Tokensvà tạo mới access tokenvới sự read_registrycho phép.

nhập mô tả hình ảnh ở đây

Bản sao đã được tạo token, chúng tôi cần nó cho package.jsontệp của mình.

nhập mô tả hình ảnh ở đây

Bây giờ package.jsonthêm vào dependencynhư dưới đây:

"my-module": "git+https://Xaqron:token@gitlab.com/Xaqron/my-module"

Thay thế Xaqronbằng tên người dùng của bạn và tokenbằng mã thông báo đã tạo. Bạn có thể chỉ định branchtagở cuối url bằng #{branch|tag}.

Lưu ý: Vì mã thông báo truy cập được đặt trong package.jsonbất kỳ ai có quyền truy cập vào dự án này đều có thể đọc kho lưu trữ, vì vậy tôi cho rằng dự án của bạn là riêng tư.


5
Cách khác là tạo Mã thông báo triển khai cho kho lưu trữ cụ thể đó. Sau đó, nó không cấp quyền truy cập đọc cho tất cả các kho lưu trữ của bạn. "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: Cài đặt git xem
Xaqron

1
Tôi cũng muốn chỉ ra rằng nếu dự án của bạn nằm trong một nhóm, thì bạn nên xác định điều này "private-module": "git+https://gitlab+deploy-token-username:deploy-token@gitlab.com/group_name/project"your usernamegroup_name
:,

8

Mặc dù câu hỏi là về Gitlab, nhưng câu hỏi này được xếp hạng khá tốt trong tìm kiếm của google, vì vậy đây là một số thông tin thêm về cách khắc phục sự cố tương tự mà tôi nhận được với Github.

Đối với tôi, chỉ thay đổi url không làm cho nó hoạt động. Dưới đây là các bước tôi phải thực hiện để khắc phục điều này:

  • git+ssh://git@github.com:owner/repo.git#master
  • Tạo một khóa triển khai và thêm nó vào repo
  • Chỉnh sửa cấu hình git ( ~/.ssh/configtạo tệp nếu nó không tồn tại) để buộc sử dụng DeployKey thay vì khóa ssh mặc định

Sau đó, cài đặt npm chỉ hoạt động. Tất cả các tùy chọn và giải pháp khác dẫn đến việc phá vỡ cài đặt npm


đó phải là một lỗi đánh máy. :owner?
chovy

1
những gì tôi làm với ~/.ssh/config? Tôi vẫn không nhận được thông qua với NPM / gitlab
chovy

6

Chỉ cần cho bất kỳ ai khác tình cờ xem qua điều này, tôi không thể có được nó làm việc qua HTTPS ở tất cả - dường như nó không hỗ trợ các liên kết trực tiếp đến repo (ví dụ https://git.domain.com/user/somerepo.git), và cũng không hỗ trợ .tar, .tar.bzhoặc .zipcác phiên bản lưu trữ.

Nó dường như chỉ hoạt động với .tar.gzkho lưu trữ.

Ví dụ đầy đủ (với phiên bản được gắn thẻ):

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


5

Không có câu trả lời nào khác phù hợp với tôi cho repo gitlab.com riêng tư ...

Tuy nhiên, điều này hoạt động:

npm i -S git+ssh://git@gitlab.com:<org>/<project>.git

Nó chỉ là url bản sao git ssh từ trường đầu vào "bản sao" của trang dự án git+ssh://được thêm vào phía trước của nó.


1
điều này hoạt động, với điều kiện là khóa công khai ssh của bạn đã được thiết lập trên tài khoản gitlab.
lasec0203

3

Theo như tôi có thể biết bạn đang làm sai ở đâu là git://giao thức. GitLab chỉ hỗ trợ (các) HTTP và SSH cho các bản sao. Vì vậy, bạn phải sử dụng một trong những phương pháp đó thay vì giao thức git.


3

Đối với tôi, thiết lập package.json như bên dưới hoạt động.

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

Mã thông báo được lấy từ "Cài đặt hồ sơ - Mã thông báo truy cập" của bạn.


Cái này cũng có tác dụng với tôi. Tôi đang làm việc đằng sau một proxy có chứng chỉ tự ký.
Stefano Mozart

điều này thực sự hiệu quả với tôi nhưng tôi tự hỏi liệu có nên để mã thông báo trong package.json vì người khác có thể sử dụng nó để viết không? gitlab (ít nhất là trong trường hợp của tôi) không cho phép tôi tạo mã thông báo truy cập chỉ đọc mà chỉ là mã truy cập đầy đủ. bạn nghĩ sao?
Cancerbero

Lưu ý: GitLab 10.7 (phát hành tháng 4 năm 2018) đã thêm "Mã thông báo triển khai" cấp dự án. Chúng nên được sử dụng thay vì "Mã truy cập" cấp người dùng. liên kết tài liệu

0

Nếu bạn muốn sử dụng một biến môi trường giữ mã thông báo thay vì mã thông báo mã hóa cứng trong URL, tôi đã đưa ra một giải pháp thậm chí khá phức tạp. Chúng ta sẽ sử dụng GIT_ASKPASSbiến môi trường để lấy mật khẩu từ một tập lệnh bash, tập lệnh này sẽ lặp lại một biến môi trường. Để vượt qua npm chỉ chuyển các biến môi trường GIT cụ thể, chúng tôi sẽ sử dụng GIT_SSHnhư một người trung gian.

Vì vậy, đã cho git_pass_env.shchứa echo $GIT_SSHchúng ta chỉ có thể gọi:

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

Đối với một dự án ví dụ với docker và docker-compo, hãy xem repo của tôi tại đây .

Sơ đồ luồng các biến môi trường:

sơ đồ dòng chảy


0

Gitlab hiện có một sổ đăng ký gói để có thể xây dựng, triển khai và lưu trữ các gói npm. Với các kho lưu trữ riêng, có thể cung cấp khả năng kiểm soát truy cập chi tiết đối với nội dung kho lưu trữ và các gói.

Các Gói NPM có thể được cài đặt từ các kho lưu trữ Gitlab riêng tư bằng cách thêm một .npmrctệp cùng với package.json. Thêm thông tin ở đây . Mặc dù nó trở nên phức tạp khi sử dụng nhiều mã thông báo triển khai cho các kho lưu trữ khác nhau trong cùng một cơ sở mã.

Với Gitlab, bạn có thể truy cập .tgztrực tiếp vào tệp gói bằng HTTPS và triển khai mã thông báo . Chỉ cần thêm phụ thuộc dự án như sau:

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

@ foo / bar xuất hiện hai lần trong URL. @foo là phạm vi dự án và thanh là tên mô-đun và 1.0.0 là tên mô-đun. project-id (số gồm 8 chữ số) là ID dự án Gitlab, có thể được nhìn thấy từ trang dự án dưới tên. Thậm chí có thể bỏ qua @foo khỏi tên mô-đun (nhưng không phải liên kết).

Sử dụng nhiều mô-đun có cùng phạm vi và các mã thông báo triển khai khác nhau giúp cho việc quản lý các kho lưu trữ riêng được an toàn. Ngoài ra, các mã thông báo Triển khai có thể chỉ có quyền truy cập package registrycó nghĩa là, người dùng cuối sẽ không thể truy cập mã nguồn hoàn chỉnh từ các kho lưu trữ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.