4. 私有仓库搭建
说到私有仓库,我其实挺有感触的。早年做SDK发布时,团队还在用共享文件夹传包,谁手滑覆盖了版本,整个项目组就得加班排查。后来我下定决心搭了Nexus,才算是把包管理这块理顺了。
说白了,私有仓库就是你们团队的「包保险柜」。它不光存东西,还能管谁拿、怎么拿、拿得快不快。今天我就把Nexus和Artifactory这两大主流方案掰开揉碎讲清楚。
核心价值一句话:私有仓库 = 存储 + 权限 + 加速。缺一个,后面都容易出乱子。
4.1 为什么需要私有仓库?
你可能觉得,用公共仓库不就行了?嗯,我以前也这么想。直到有一次,某个依赖库在Maven Central上突然下架了,我们整个CI流水线全挂。那叫一个酸爽。
私有仓库能解决三个核心痛点:
- 可靠性:公共仓库挂了,你照样能构建。我经历过一次,从此再也不敢裸用公共源。
- 安全性:内部SDK不能公开,私有仓库是唯一选择。你想想看,核心算法包传到公共仓库,那画面太美不敢看。
- 速度:代理缓存后,同一份依赖不用反复从外网拉。团队100个人,每人拉一次,带宽就炸了。
4.2 Nexus vs Artifactory:怎么选?
这两个我都部署过,各有千秋。我个人的习惯是:小团队用Nexus,大企业用Artifactory。为什么?
| 对比维度 | Nexus (Sonatype) | Artifactory (JFrog) |
|---|---|---|
| 部署难度 | 轻量,单机几分钟搞定 | 稍重,配置项多 |
| 性能 | 够用,百人团队无压力 | 高并发场景更稳 |
| 权限模型 | 基于角色,够用 | 细粒度到仓库路径 |
| 包类型支持 | Maven、npm、Docker等 | 几乎全覆盖,包括Conan、Go |
| 价格 | 开源免费版够用 | 企业版收费,功能全 |
我在项目中遇到过一个小团队,选了Artifactory,结果运维同学配置了三天还没跑起来。后来换成Nexus,半小时就上线了。所以别盲目追大,合适最重要。
4.3 Nexus部署实战
我一般用Docker部署,干净利落。给你看个我常用的docker-compose配置:
version: '3'
services:
nexus:
image: sonatype/nexus3:latest
container_name: nexus
ports:
- "8081:8081"
- "8082:8082"
volumes:
- ./nexus-data:/nexus-data
environment:
- INSTALL4J_ADD_VM_PARAMS=-Xms2g -Xmx2g
restart: always
小技巧:第一次启动后,管理员密码在容器内的 /nexus-data/admin.password 文件中。我当年找了半小时才找到,别踩这个坑。
启动后访问 http://你的IP:8081,默认管理员账号是 admin。进去第一件事,我建议你:
- 改掉默认密码
- 创建匿名访问权限(看你们安全策略)
- 配置Blob Store,把存储路径指向大磁盘分区
4.4 权限与认证配置
权限这块,我吃过亏。早期我图省事,给所有人开了admin权限。结果有人误删了某个release版本,回滚花了一整天。
我的建议是遵循最小权限原则:
- 开发者:只给对应仓库的
read和browse权限 - CI/CD:给
read+write,但限制只能推snapshot版本 - 管理员:才给全部权限
在Nexus里,配置路径是:Security > Roles > Create Role。我习惯按团队建角色,比如 sdk-team-dev、sdk-team-ci。这样后续加人只要关联角色就行。
注意:千万不要把匿名写权限打开。我曾经见过一个团队,匿名用户能上传包,结果被人传了个恶意版本,整个构建链都污染了。
认证方式上,我推荐用Token而不是密码。在Nexus里,用户可以在 Profile > User Token 生成。CI/CD里用Token,密码泄露了也不怕。
4.5 代理与缓存策略
这是私有仓库最实用的功能。说白了,就是给公共仓库加个「本地镜像」。你拉过的包,下次直接从本地拿,速度飞起。
我画了个流程图,帮你理解这个逻辑:
配置代理仓库其实很简单。以Nexus为例,创建一个 proxy 类型的仓库,填上公共仓库地址就行。比如Maven的代理:
仓库名称: maven-central-proxy
远程存储地址: https://repo1.maven.org/maven2/
Blob Store: 选一个大的存储卷
缓存策略: 我一般选「过期时间7天」
我的经验:缓存策略别设太短。设成1天的话,热门包每天都要重新拉,等于没缓存。我一般设7-30天,除非是SNAPSHOT版本才设短一点。
另外,我建议把多个公共仓库组合成一个 仓库组。比如建一个 maven-all 组,里面包含 maven-central-proxy、maven-google-proxy 等。开发者只需要配一个地址,省心。
4.6 避坑指南
最后分享几个我踩过的坑:
- 磁盘空间:缓存会越来越大。我有个项目半年没管,缓存占了200G。建议设个定时任务清理旧版本。
- 网络超时:代理公共仓库时,如果网络不稳定,构建会卡住。我习惯把超时时间设长一点,比如30秒。
- 版本覆盖:同一个版本号不要重复上传。Nexus默认不允许覆盖release版本,这个设置别改。
嗯,私有仓库这块内容不少,但核心就是这三件事:部署好、权限管好、缓存用好。你按这个思路走,基本不会出大问题。