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。进去第一件事,我建议你:

  1. 改掉默认密码
  2. 创建匿名访问权限(看你们安全策略)
  3. 配置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 代理与缓存策略

这是私有仓库最实用的功能。说白了,就是给公共仓库加个「本地镜像」。你拉过的包,下次直接从本地拿,速度飞起。

我画了个流程图,帮你理解这个逻辑:

开发者/CI 私有仓库 (Nexus/Artifactory) 缓存命中? 命中 → 直接返回 未命中 公共仓库 Maven Central npmjs.org 等 拉取后缓存到本地

配置代理仓库其实很简单。以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版本,这个设置别改。

嗯,私有仓库这块内容不少,但核心就是这三件事:部署好、权限管好、缓存用好。你按这个思路走,基本不会出大问题。