37f1d09bbe774553fd7e880d57ce87d4
雕虫晓技(四) 搭建私有Maven仓库(带容灾备份)

0. 前言

随着 Android 开发的发展,Android 开发也相对越来越简单,很多基础库只用简单的添加一行依赖就可以使用了,不用自己去手动添加,升级也只需要修改一下版本号,简单便捷。那么它是如何实现的呢?事实上,我们所依赖的这些文件,是存放在一些公开仓库中的,当我们添加这些依赖时,Gredle 会自动去仓库中查找是否存在,如果存在,就下载下来放到本地参与编译。

我们最常用的一些公开库大部分是放在 jcenter 仓库中的,我们在创建项目的时候会默认添加 jcenter 仓库,在项目的 build.gradle 文件中可以看到,如下:

allprojects {
    repositories {
        jcenter()
    }
}

但是,当我们自己开发的一些基础组件,也想要这样方面的添加到项目中时,就有点麻烦了,我们可以使用 bintray 把这些组件上传到 jcenter 上面,但是上传过程非常麻烦,有一定的审核周期,并且一旦通过几乎无法撤销。

除了 jcenter 这个官方使用的仓库,jitpack 也是不错的选择,它借助于 GitHub 进行上传,上传和配置过程都有极大的简化,并且没有审核周期,很多公开项目都转用 jitpack 了。

但是,公开仓库仅适合托管一些公开的内容,假若这些库涉及到部分商业机密,或者存在某些私密技术方案,不希望被竞争公司了解,那么托管在公开仓库上无疑是非常不合适的。

为了解决这些需求,自然就会有私有仓库的诞生,相信有不少公司都有自己的私有仓库。
如何搭建一个私有仓库网络上有大量的教程,也并不困难,但是重点是如何保证私有仓库的安全稳定却是一个大问题。
如果仓库出现问题,则可能会导致所有的项目都无法 build 通过,会浪费大量的开发时间。

因此,在搭建一个私有仓库时,就必须要考虑到风险问题。下面我们就从头开始搭建一个仓库,并将教大家如何规避一些常见的风险。

1. 仓库搭建

我们 Android 使用的是 maven 仓库,关于私有的 maven 仓库,有很多集成好的仓库环境,甚至你可以不借助任何环境自己手动维护一个仓库。当然,手动维护仓库需要耗费非常多的时间和精力,对于普通的开发人员来说,是得不偿失的,毕竟时间就是金钱,因此我们使用集成好的仓库环境,例如本文中会用到 Sonatype 的 Nexus。

1.1 Java环境

要运行 Nexus,需要 Java 环境,根据教程进行 Oracle Java 安装和配置 即可,配置好环境就可以进行下一步了。

1.2 下载

到 Sonytype 官网 https://www.sonatype.com/download-oss-sonatype 下载自己所需的平台和版本。

01-download

01-download

直接下载对应平台的版本即可。

下载后解压到合适的目录,无需安装,可以看到两个文件夹(所有平台的都一样),如下:

02-Sonytype目录

02-Sonytype目录

目录 备注
nexus-x.x.x-xx 这个文件夹是存放应用程序的。
sonatype-work 这个文件夹是存放仓库和设置等相关内容的,如果备份数据,只用备份这个文件夹即可

初次配置,我们只用关注如下几个文件即可:

文件 备注
./nexus-3.8.0-02/bin/nexus 运行程序
./nexus-3.8.0-02/bin/nexus.rc 用户配置
./nexus-3.8.0-02/etc/nexus-default.properties 端口配置

初期需要了解的文件就这三个,在 Linux 系统上使用 root 用户直接运行可能会警告,因此可以配置一下nexus.rc文件。至于端口号,默认是 8081,如果对这个没特殊要求,默认即可。

至于 ./nexus-3.8.0-02/bin/nexus 是主要的运行程序,建议将 bin 目录配置到环境变量中,这样就可以在任意位置启动和停止该程序了,否则只有在 bin 目录下才能调整。

Window 版本是 ./nexus-3.8.0-02/bin/nexus.exe 不过用法是一样的。

1.3 运行

在命令行工具中输入启动命令:

nexus start

如果一切顺利,在等待几十秒到一两分钟之后就可以查看我们的仓库了,如果出错了,可以使用 run 命令来查看具体的出错原因:

# run 命令相当于 debug 模式,会输出所有的日志信息
nexus run

当然,Nexus 还有很多其他命令(例如:停止、重启、查看状态等):

nexus {start|stop|run|run-redirect|status|restart|force-reload}

1.4 查看

在输入 nexus start 命令后,稍微等待一两分钟,就可以查看仓库了,如果在本机有图形化界面,直接在浏览器中输入 http://localhost:8081 即可查看,如果修改了端口号,后面写对应的端口号即可。如果是运行在服务器上,则在其他电脑上输入http://{服务器ip}:{port} IP 和对应的端口号。如果运行成功,则会看到类似如下界面:

03-nexus

03-nexus

备注:

  • 在 Linux 和 Mac 上通过 ifconfig 查看本机 IP。
  • 在 Windows 上通过 ipconfig 查看本机 IP。
  • 127.0.0.1(localhost) 是本机回环地址,在其他机器上访问时不要使用这个地址。

2. 仓库配置

经过上面的步骤,我们就有了一个空仓库,但是这个仓库还还需要进行一些基础的配置。

2.1 账号配置

2.1.1 点击界面右上角的 Sign In 进行登录。

初次登陆时使用默认账号:admin,密码:admin123。

04-signin

04-signin

2.1.2 登陆后创建一个新用户

05-create-user

05-create-user

2.1.3 填写用户信息

06-create-user-info

06-create-user-info

填写具体的用户信息,其中比较重要的部分已经用红字标记出来了。

注意:

  • 注意用户权限,默认应该是有两个权限,管理员权限和所有用户(包括未登录用户)权限。
  • Roles 左侧为目前的权限组,右侧为当前用户拥有的权限组,可以通过 [>] 和 [<] 按钮来调整用户权限。
  • 在创建完新的用户后记得删除最初的管理员账号或者修改管理员账号的密码。
  • 用户所拥有的权限,是根据其拥有的权限组决定的,只要拥有 nx-admin 权限组,就拥有所有的管理权限,要注意该权限的分配。

2.2 创建仓库

仓库也是在设置中进行创建的,如下:

07-create-repository

07-create-repository

08-create-repository2

08-create-repository2

我们用 maven 仓库即可,可以看到,仓库主要有三种类型:

  • hosted: 本地仓库,我们一般使用这种类型的仓库。
  • proxy: 代理仓库,用于代理其他远程仓库。
  • group: 仓库组,用来合并多个 hosted / proxy 仓库。

在一般情况下,我们创建 hosted 类型的 maven 仓库。

填写仓库信息

09-create-repository3

09-create-repository3

如果没有特殊需求,直接填写一个名称然后点击创建即可。

注意:

  • Version policy(版本模式) 有三种模式 Release(发布)、Snapshot(快照)、Mixed(混合)。
  • Layout policy(布局模式) 有两种模式 Strict(严格模式)、Permissive(宽松模式)。
  • Deployment policy(部署模式) 有三种模式 Allow redploy(允许重新部署)、Disable redploy(不允许重新部署)、Read-only(只读)。

一般情况下按照默认配置即可,需要注意的是,部署策略一般情况下请使用默认配置 Disable redploy(不允许重新部署),例如,v1.0.0 版本的组建上传后,修改后再次以 v1.0.0 版本进行上传会上传失败,这样可以保证版本上传后不会被误覆盖掉,如果确定之前 v1.0.0 版本是错误上传的,需要重新上传,可以手动删除后再次上传,这样是最稳妥的。

在创建完成后就可以在仓库列表中查看到新创建的仓库了。

10-new-repository

10-new-repository

2.3 用户权限配置

用户权限配置相对来说稍微复杂一点,如果开发人员较少,又都是老手,不会存在小白删库的情况下,可以给所有人都分配一个管理账号或者共用一个管理员账号即可。

如果开发人员众多,又比较复杂,则需要仔细的控制每一个用户的权限,一般来说,给普通用户分配公共仓库的查看、上传、读取的权限,不要给编辑和删除的权限。 下面就带大家了解一下权限的详细设置方式:

Nexus 默认就有一个游客账号(anonymous),在默认状态下拥有浏览所有仓库的权限,即在不登陆的情况下,可以查看所有仓库。

11-User-Anonymous

11-User-Anonymous

该账号的权限分配十分重要,它意味这赋予所有未登录用户的权限,如果将管理员权限分配给了该账号,就意味着所有未登录用户都可以使用管理员权限,如果没有特殊情况,不要随意修改该账号的默认权限。

如果你不希望未登录用户查看,可以选择取消启用未登录账号,如下:

12-Disable-Anonymous

12-Disable-Anonymous

然而,如果我们希望游客可以查看和使用一部分仓库,另外部分仓库又不希望被未登录用户看到,那么就需要详细进行设置了。

既然要修改权限,就要了解 Nexus 的权限管理方式,首先与权限有关的有如下几种:

13-Sceurity

13-Sceurity

它们的关系如下:

14-Nexus权限结构

14-Nexus权限结构

注意:

  1. 用户是通过持有不同的角色(权限组)来确定自己的权限管理范围的。
  2. 角色(权限组)可以由基础权限和其他基础权限组来构成。

上面是 Nexus 支持的权限构成方式,在一般情况下我喜欢按照下面这种方式组织自己的权限。

15-角色分组

15-角色分组

我把用户分为四类(超级管理员、仓库管理员、普通用户、游客),并创建了四种类型的角色(权限组),分别与之对应,这样在添加新用户的时候只需要赋予他对应的角色(权限组)即可。

2.3.1 游客权限配置

创建角色(权限组)

16-create-role

16-create-role

创建游客角色

其他的角色(权限组)也按照该方式进行创建即可,假设我们想把 gcssloop-central 这个仓库作为公开仓库,将这个仓库的查看和读取权限给予游客角色。

17-role-anyone

17-role-anyone

赋予游客用户权限

18-anyone

18-anyone

基础的设置方式就如上所示,只是不同的用户角色,拥有不同的权限而已。

2.3.1 普通用户权限配置

18-1-normal-user

18-1-normal-user

top Created with Sketch.