前言
NuGet
Nuget 是免費、開源的包管理工具,專注於在 .Net
、.Net Core
平台應用開發過程中第三方組件庫的管理,相對於傳統單純的 dll 引用要方便、科學得多。
其中 nuget.org
是最著名的 NuGet 公開庫,但是企業內部開發的(業務)公共組件因為私密性或商業機密不能上傳到公共庫中,所以企業內部需要搭建一個私有的 NuGet 倉庫【私服】來支持。雖然微軟有提供的 NugetServer,但 NugetServer 用起來並不那么方便。
而且企業有可能不止使用 C#
一種語言,可能其他的語言組件也需要管理,比如:Java
、Docker 鏡像
等,NugetServer 就捉襟見肘,本文我給大家帶來一款全能型的私服軟件 Nexus
。
Nexus 私有倉庫
Nexus 是一個強大的工具倉庫管理器,它極大地簡化了本地內部倉庫的維護和外部倉庫的訪問。
Nexus 支持管理 Bower 、Docker、Maven、npm、NuGet、Yum、PyPI 等工具包。最新版本的 Nexus3.x 全面支持 Docker 的私有鏡像存儲。
Nexus 官網:www.sonatype.com
說明
本文主要介紹怎么在 Linux
(CentOS
) 系統上使用 Docker
來部署 Nexus ,本文使用的是 Nexus v3.15.3
版本進行操作的。
為什么使用 Docker 來部署 Nexus,是因為作者公司現在的基礎設施為了方便維護全部使用 Docker 來部署。如果你不想使用 Dokcer 或者不想在 Linux 部署請前往官方網站下載對應安裝包。
注意:本文是在 CentOS 系統下進行操作的。
安裝 Nexus
下面介紹的安裝步驟是作者在 Linux 系統已經安裝了 Docker 為前提條件。
拉取 Nexus 鏡像
從 Docker Hub
拉取 Nexus 的鏡像到本地,我這里拉取是最新版本的。你也可以拉取相對應版本的鏡像。
$ docker pull sonatype/nexus3:latest
latest: Pulling from sonatype/nexus3
a02a4930cb5d: Pull complete
2c6aa0f814dc: Pull complete
ce7b7501fc94: Pull complete
Digest: sha256:00ede0830e375c8a9758ea5d98dd020425850bbeccc822da68e7bad7ae92dbfa
Status: Downloaded newer image for sonatype/nexus3:latest
運行 Nexus
在運行之前先創建一個目錄用來存放 Nexus 持久化數據。
$ mkdir -p /data/nexus
使用 Docker 命令運行 Nexus 。
$ docker run -d -p 8081:8081 --name nexus -v /data/nexus:/nexus-data sonatype/nexus3:latest
c90c62f4bd5d3f09d3f0d562e5fe41401954898729ed9f7407ed71296f372883
Docker 返回容器的的 Hash ID,代表容器已經啟動,通過 http://serverip:8081 就能訪問Nexus了。
但是請求的時候拒絕我的請求,這個地方困擾了我很久。我第一步先排除是否是防火牆的問題。
$ firewall-cmd --state
not running
使用命令查看防火牆沒有運行,第二步查看容器當前狀態。
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS
c90c62f4bd5d sonatype/nexus3:latest "sh -c ${SONATYPE_DI…" 27 minutes ago Exited
發現這個容器的狀態變成 Exited
已經退出,找到問題所在可能是什么原因導致 nexus 沒有啟動起來。現在使用容器日志查一下掛掉的原因。
$ docker container logs c90c
mkdir: cannot create directory '../sonatype-work/nexus3/log': Permission denied
mkdir: cannot create directory '../sonatype-work/nexus3/tmp': Permission denied
OpenJDK 64-Bit Server VM warning: Cannot open file ../sonatype-work/nexus3/log/jvm.log due to No such file or directory
Warning: Cannot open log file: ../sonatype-work/nexus3/log/jvm.log
Warning: Forcing option -XX:LogFile=/tmp/jvm.log
Unable to update instance pid: Unable to create directory /nexus-data/instances
/nexus-data/log/karaf.log (No such file or directory)
Unable to update instance pid: Unable to create directory /nexus-data/instances
從日志發現是因為 Nexus 在創建文件夾的時候沒有權限。這個應該是上面在創建文件夾的時候沒有分配權限導致的。下面我們給這個 /data/nexus
文件夾分配權限。
$ chown -R 200 /data/nexus
$ docker container start c90c62f4bd5d
c90c62f4bd5d
重新啟動容器后,再次訪問一下 Nexus,下圖顯示可以打開 Nexus 。
我們現在發現 Nexus 可以支持很多倉庫格式。我們現在已經安裝完成了,下面我們來講怎么簡單使用 Nexus。
Nexus NuGet 倉庫簡單使用
下面將只會介紹一下怎么使用 NuGet
,至於使用 Nexus 其他倉庫請前往官方查看詳情文檔。
Nexus 默認帳號
Nexus 的默認管理員賬號 admin
,密碼 admin123
。可以在 Nexus 管理界面右上角 Signin 按鈕可以登錄Nexus。登錄完成之后可以點擊下面圖片齒輪圖標,進行管理 Nexus 。
Repositories
點擊右菜單的 Repositories
按鈕可以看到 Nexus 內置的默認倉庫:
Repositories 說明
Nexus 默認已經創建好了 Nuget 以及其他的倉庫,並且是創建了3個不同類型的倉庫:nuget-group
、nuget-hosted
、nuget.org-proxy
。
nuget.org-proxy:類型是 proxy,表示代理倉庫。我們向它請求包(package)的時候,如果本地有,它就從本地提供,如果本地沒有,它會從 nuget.org
下載到本地,然后給我提供這個包。
nuget-hosted:類型是 hosted,表示托管倉庫。我們一般把自己開發的包上傳到該倉庫中。
nuget-group:類型是 group,表示倉庫組,它結合了 nuget.org-proxy 和 nuget-hosted ,能對外提供上述兩者中的包。
小結:
nuget-hosted
負責包上傳,nuget.org-proxy
負責代理從 nuget.org
下載包到 Nexus 緩存中,nuget-group
負責提供包。一般使用 nuget-group
提供的 URL 就可以了,它可以把私服和公共庫進行合並。
上傳組件包(Package)
准備 Package
-
先使用
Visual Studio
創建一個類庫項目
命名為NexusTest
。 -
在
解決方案資源管理器
選中 NexusTest 項目右擊點擊屬性。進入項目設置頁選擇打包
選項卡。勾選在版本中勝出NuGet包
。 -
在
解決方案資源管理器
選中 NexusTest 項目右擊點擊生成
。生成成功之后在本項目的bin\Debug
目錄下找到NexusTest.1.0.0.nupkg
Nuget 文件,代表 Package 已經准備完成。
上傳 Package
-
添加
Nuget Realms
,因為 Nexus 認證 Nuget 是通過Realms
來認證,因此要添加 Nuget Realms。 -
在
Upload
選中nuget-hosted
點擊進入,為什么要選中 nuget-hosted 上面已經說明。 -
把上面准備好的
NexusTest.1.0.0.nupkg
Nuget 文件上傳到 Nexus。 -
第三步上傳成功,在
Browse
選中nuget-hosted
點擊進入。可以查看到已經上傳成功。
使用 Package
-
獲取 Nuget 程序包源地址,在 Nexus 的 Browse 找到
nuget-group
獲取到地址。 -
在
Visual Studio
的Nuget 管理器
,點擊齒輪進行設置 Nexus 地址。 -
添加 Nexus 私有 Nuget 倉庫地址。
-
通過
Nuget 管理器
查詢一下剛剛我們上傳的NexusTest
包。
總結
Nexus 基本可以滿足企業的私服需求,而且還有一個可視化工具進行管理,降低企業管理成本。
引用:
Nexus 鏡像詳細說明:https://hub.docker.com/r/sonatype/nexus3/
使用 Nexus 搭建私有 Nuget 倉庫:http://www.cnblogs.com/Erik_Xu/p/9211471.html
Linux的權限:https://www.cnblogs.com/lhm166/articles/6605059.html
關閉防火牆:https://blog.csdn.net/ytangdigl/article/details/79796961
>原文:https://www.zybuluo.com/aqa510415008/note/1438493