安装nexus3

以下配置中的<nexus_host>都可以使用主机名.local(mDNS 域名)来代替

  • docker
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mkdir -p /usr/local/nexus3
chown -R 200 /usr/local/nexus3

docker run -d \
--privileged=true \
--name=nexus3 \
-u root \
-p 8081:8081 \
# 这几个端口给docker私有仓库使用,故在需要使用 Docker 的机器上修改 `/etc/docker/daemon.json`:{"insecure-registries": ["你的服务器IP:8001", "你的服务器IP:8002", "你的服务器IP:8003"]}
-p 8001:8001 \
-p 8002:8002 \
-p 8003:8003 \
# 启动容器时加入时间挂载,使用宿主机时间
-v /etc/localtime:/etc/localtime:ro \
-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime:ro \
-v /usr/local/nexus3/nexus-data:/nexus-data \
-e INSTALL4J_ADD_VM_PARAMS="-Xms1g -Xmx1g -XX:MaxDirectMemorySize=2g" \
docker.io/sonatype/nexus3

登录仓库页面:http://ip:8081
默认账号admin,初始密码则存在容器中的 /nexus-data/admin.password 文件中。
  • docker-compose
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
version: '3.8'

services:
nexus3:
image: sonatype/nexus3:latest
container_name: nexus3
restart: no
privileged: true
user: root
ports:
- "8081:8081" # Maven, NPM, nexus界面全靠它
- "8001:8001" # 预留给 Docker Hosted (推送私有镜像)
- "8002:8002" # 预留给 Docker Proxy (代理缓存)
- "8003:8003" # 预留给 Docker Group (聚合查询)
volumes:
- /etc/localtime:/etc/localtime:ro
- /usr/local/nexus3/nexus-data:/nexus-data
environment:
- INSTALL4J_ADD_VM_PARAMS=-Xms1g -Xmx1g -XX:MaxDirectMemorySize=2g

问题补记

问题:nexus启动失败,报错 cannot open local storage ‘/nexus-data/db/{config或者component}‘ with mode=rw

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 切记在磁盘满了的情况不要随意清除blob下vol文件,但可以尝试拷贝出去,之后启动nexus成功后再拷贝回来

java -jar /usr/local/sonatype/nexus/lib/support/nexus-orient-console.jar
# 有时候在连接数据库这一步会报错,错误内容跟最初的错误很类似,但主要信息是这段:Storage '{config或者component}' was not closed properly. Will try to recover from write ahead log...,此时需要进入到数据库的文件目录,删除*.wal文件,然后重新打开console工具,执行修复
# rm -rf /usr/local/nexus3/nexus-data/db/{config或者component}/*.wal
orientdb> CONNECT PLOCAL:/usr/local/nexus3/nexus-data/db/{config或者component} admin admin
orientdb> rebuild index *
orientdb> repair database --fix-links
orientdb> repair database --fix-graph
orientdb> repair database --fix-ridbags
orientdb> repair database --fix-bonsai
orientdb> disconnect

chmod 777 -R /usr/local/nexus3/nexus-data/db

# 如果修复后依旧启动失败可尝试重建
java -jar /usr/local/sonatype/nexus/lib/support/nexus-orient-console.jar
orientdb> CONNECT PLOCAL:/usr/local/nexus3/nexus-data/db/{config或者component} admin admin
orientdb> export database config-export
orientdb> drop database
orientdb> create database plocal:/usr/local/nexus3/nexus-data/db/{config或者component} admin admin
orientdb> import database config-export.json.gz -preserveClusterIDs=true
orientdb> rebuild index *
orientdb> disconnect

# 注:如果有多个数据库被损坏,重复上面的步骤,即可,注意修改数据库文件夹的目录。此时基本解决了所有启动问题,重新启动Nexus服务即可

Docker仓库配置

docker仓库规划(方式一)

在Nexus3中支持3种Docker仓库:

  • hosted:本地仓库,同Docker官方仓库一样。
  • proxy:代理仓库,提供代理其他仓库的功能,如我内网只有一台主机能上网,其他主机不能上网,则可以在可以上网的主机上面配置这种代理仓库,然后别的不能上网的主机就可以通过该代理仓库下载docker镜像了。
  • group:聚合仓库,将多个仓库组合成一个仓库。

我需要配置这三种类型的仓库,现规划如下:

仓库类型仓库名称HTTP端口号HTTPS端口号支持docker操作
proxy代理仓库docker-proxy8001不设置pull
hosted本地仓库docker-hosted8002不设置pull、push
group聚合仓库docker-group8003不设置pull

创建docker blob 对象

为了使docker的blob和其他的不同,我们创建一个docker的blob,用来存储docker相关的文件。

依次点击【Repository】--【Blob Stores】--【Create Blob Store】:

Blob类型选择File

然后,名称设置为docker,不勾选【Soft Quota】,最后点击【Save】保存:

可以看到,新的Blob创建成功:

然后,创建docker-proxy代理仓库。

创建docker-proxy代理库

进入到设置页面后,点击左侧的【Repositories】进入到仓库管理页面,点击【Create Repository】按钮,我们需要使用的docker仓库,以看到docker(proxy)

`进入到docker代理仓库配置界面,依次填写相关信息。

docker代理仓库说明:

  • name: docker-proxy
  • format: docker
  • type: proxy
  • HTTP端口:8001
  • HTTPS端口:不勾选,忽略
  • Allow anonymous docker pull ( Docker Bearer Token Realm required ): 允许匿名下载镜像,勾选该处。
  • Enable Docker V1 API: 允许docker客户端使用V1 API,勾选该处。
  • Remote storage: 远程存储仓库的URL地址【可以配置成国内加速源地址】。
  • Docker Index: 这里为了确保能够拉取 DockerHub 最新的镜像,我选择了 Use DockerHub 这个 Index。
  • HTTP request setting,HTTP请求设置,我们一般只需要设置一下User-Agent请求头即可,如填写"Sync docker image. email: mzh.whut@gmail.com"。

注意,代理URL请使用科大镜像、网易、阿里云等加速源,或者腾讯内网地址https://mirror.ccs.tencentyun.com ,不要使用截图中的腾讯外网地址 https://mirrors.cloud.tencent.com

使用 docker Blob存储,最后点击【Create repository】创建仓库即可。

创建后,点击新创建的docker-proxy仓库,可以看到仓库详情:

创建docker-hosted本地仓库

创建docker-hosted本地仓库:

docker本地仓库说明:

  • name: docker-hosted
  • format: docker
  • type: hosted
  • HTTP端口:8002
  • HTTPS端口:不勾选,忽略
  • Allow anonymous docker pull ( Docker Bearer Token Realm required ): 允许匿名下载镜像,勾选该处。
  • Enable Docker V1 API: 允许docker客户端使用V1 API,勾选该处
  • Blob store: 选择【docker】blob对象
  • Deployment policy: 测试时,先可以选择【Allow redeploy】允许重复发布,后期如果用在正式生产环境时,可以将该修改为【Disable redeploy】。

相关信息填写好后,最后点击【Create repository】创建仓库即可。

创建docker-group聚合仓库

创建docker-group聚合仓库:

docker聚合仓库说明:

  • name: docker-group
  • format: docker
  • type: group
  • HTTP端口:8003
  • HTTPS端口:不勾选,忽略
  • Allow anonymous docker pull ( Docker Bearer Token Realm required ): 允许匿名下载镜像,勾选该处。
  • Enable Docker V1 API: 允许docker客户端使用V1 API,勾选该处
  • Blob store: 选择【docker】blob对象
  • Group: Member Repositories,将【docker-hosted】和 【docker-proxy】添加到右侧,这里成员仓库的顺序可以稍微规划下,一般来说将本地的放前面,代理第三方的放后面,好处就是优先使用本地或小众的镜像仓库。

相关信息填写好后,最后点击【Create repository】创建仓库即可。

这样我们三个docker仓库已经创建好了:

开启匿名访问权限/Token

依次点击【Security】--【Realms】,将【Docker Bearer Token Tealm】添加到右侧

配置是否允许匿名登录【勾选上红框标记的位置】

最后点击【Save】保存即可。

测试代理仓库下载镜像

先修改/etc/docker/daemon.json配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@master ~]# cd /etc/docker/
# 备份
[root@master docker]# mv daemon.json daemon.json.bak
# 修改配置文件
[root@master docker]# vi daemon.json
# 查看配置文件内容
[root@master docker]# cat daemon.json
{
"insecure-registries":[
"<nexus_host>:8001",
"<nexus_host>:8002",
"<nexus_host>:8003"
],
"registry-mirrors":[
"http://<nexus_host>:8001",
"http://<nexus_host>:8002",
"http://<nexus_host>:8003"
]
}
[root@master docker]#

重启docker服务:

1
2
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl restart docker

执行下载镜像之类后,在nexus上面检查Blob对象:

在nexus Browse中也可以看到对应的镜像信息:

如果能够正常代理,则下载镜像时,上面两个位置的信息会发生变化,blob对象会增加,Browse浏览器中也可以看到新下载的镜像信息。

docker仓库规划(方式二)

  • 仅创建一个docker hosted仓库供push和pull私有镜像
  • pull第三方镜像使用国内镜像源优化速度

新建docker blob

创建docker-hosted仓库

添加Token/配置匿名

配置docker

在daemon.json中添加如下配置

1
2
3
4
5
6
7
8
{
"insecure-registries": [
"<nexus_host>:8002"
],
"registry-mirrors": [
"国内镜像源【腾讯云主机优先考虑https://mirror.ccs.tencentyun.com】"
]
}

拉取镜像测试

如果是方式一,地址使用<nexus_host>:8003
如果是方式二,地址使用<nexus_host>:8002
如果是本地访问,<nexus_host>可以替换为localhost

- 使用 `docker pull` 命令拉取镜像时,需要指定Nexus 3的地址。
- 格式:`docker pull <Nexus地址>/<原始镜像名>`。

Npm仓库配置

创建blob存储

为其创建一个单独的存储空间。

进入设置,依次建立npm仓库

创建npm(hosted)私有仓库(hosted改成allow redeploy,这样才能运行重复上传一个包,不然会报400:bad request)

创建npm(proxy)仓库(proxy的remote storage设置:当私有仓库和代理仓库缓存包里无请求的包时,就会通过这里配置的地址去服务器下载需要的包,然后再缓存下来)

创建npm(group)仓库

配置权限

注意点:

npm install后报错如下,可通过配置npm bearer token realm解决

检查npm nexus的 Realms设置,把npm Bearer Token realm放入Active中,并保存

检查一下Nexus Repository Manager上的Anonymous是否开放

使用私有仓库方式

为某一个组配置仓库地址

1
npm config set @chint:registry http://<nexus_host>:8081/repository/npm-group/

全局配置

1
npm config set registry http://<nexus_host>:8081/repository/npm-group/

发布配置方式1

  1. 根据提示输入用户/密码/邮箱: npm adduser --registry=http://<nexus_host>:8081/repository/npm-hosted/

  2. package.json内添加

1
2
3
"publishConfig": {
"registry": "http://<nexus_host>:8081/repository/npm-hosted/"
}
  1. 命令: npm publish

发布配置方式2

  1. 根据提示输入用户/密码/邮箱: npm adduser --registry=http://10.137.8.212:8081/repository/npm-hosted/

  2. 命令: npm publish --registry=http://10.137.8.212:8081/repository/npm-hosted/

Maven仓库配置

有默认的这几个仓库:

  1. maven-central:maven中央库,默认从https://repo1.maven.org/maven2/拉取jar
  2. maven-releases:私库发行版jar,初次安装请将Deployment policy设置为Allow redeploy
  3. maven-snapshots:私库快照(调试版本)jar
  4. maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,在本地maven基础配置settings.xml中使用。

Nexus默认的仓库类型有以下四种:

  1. group(仓库组类型):又叫组仓库,用于方便开发人员自己设定的仓库;
  2. hosted(宿主类型):内部项目的发布仓库(内部开发人员,发布上去存放的仓库);
  3. proxy(代理类型):从远程中央仓库中寻找数据的仓库(可以点击对应的仓库的Configuration页签下Remote Storage属性的值即被代理的远程仓库的路径);
  4. virtual(虚拟类型):虚拟仓库(这个基本用不到,重点关注上面三个仓库的使用);

Policy(策略): 表示该仓库为发布(Release)版本仓库还是快照(Snapshot)版本仓库;

创建Blob Stores

文件存储的地方,创建一个目录的话,对应文件系统的一个目录,可供仓库上传文件使用,如图所示:

创建一个阿里云的代理(proxy)仓库

由于访问中央仓库有时候会比较慢,这里添加一个阿里云的代理仓库,然后优先级放到默认中央库之前, 阿里云的maven仓库url为http://maven.aliyun.com/nexus/content/groups/public

然后maven-public组里面将这个aliyun-proxy仓库加入,排在maven-central之前即可。

Nexus仓库分类的概念

1)Maven可直接从宿主仓库下载构件,也可以从代理仓库下载构件,而代理仓库间接的从远程仓库下载并缓存构件

2)为了方便,Maven可以从仓库组下载构件,而仓库组并没有时间的内容(下图中用虚线表示,它会转向包含的宿主仓库或者代理仓库获得实际构件的内容)

本地Maven使用私服

安装和配置好之后,在开发中可在maven的默认配置settings.xml中修改如下:

这里需要注意几点:

  1. <id> 元素必须在 repositoriespluginRepositoriesdistributionManagement 元素中保持一致。且pom.xml中指定的<id>setting.xml中下的<id>对应上(无论是<server><mirror>或是其他标签)!这是因为 <id> 元素用于唯一标识 Maven 存储库,以便 Maven 可以在 settings.xml 文件中的元素中查找与之匹配的凭据。
  2. <url> 元素指定 Maven 存储库的 URL。确保 URL 是正确的,并且可以通过网络访问。
  3. <releases> 元素和 <snapshots> 元素用于指定 Maven 存储库是否支持发布版本和快照版本。对于支持发布版本的存储库,将 <releases> 元素的 <enabled> 子元素设置为 true,对于支持快照版本的存储库,将 <snapshots> 元素的 <enabled> 子元素设置为 true。如果您的存储库不支持某种类型的版本,则可以将相应的元素设置为 false
  4. <updatePolicy> 元素指定 Maven 更新依赖关系的策略。对于快照版本,可以将 <updatePolicy> 元素设置为 always,以确保 Maven 始终从存储库中获取最新的快照版本。对于发布版本,通常将 <updatePolicy> 元素设置为 dailynever,以减少网络流量和依赖项下载时间。
  5. 如果您使用了自签名的 SSL 证书,则需要在 Maven 的 settings.xml 文件中配置 <servers> 元素,并将 trustStoretrustStorePassword 属性设置为包含 SSL 证书的 Java 密钥库和密码,以便 Maven 可以验证 SSL 证书并与 Nexus 存储库建立安全连接。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<servers>
<server>
<id>nexus</id>
<username>admin</username>
<password>xxx</password>
</server>
</servers>
<mirrors>
<mirror>
<id>nexus</id>
<url>http://<nexus_host>:8081/repository/maven-public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>nexus</id>
<url>http://<nexus_host>:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<url>http://<nexus_host>:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</snapshots>
</pluginRepository>
</pluginRepositories>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>

元素activeByDefault:

配置了<activeByDefault>标签的profile只会在没有其他激活的profile的情况下被激活

元素updatePolicy:

用来配置Maven从远程仓库检查更新的频率,默认的值是daily,表示Maven每天检查一次。其他可用的值包括:never——从不检查更新;always——每次构建都检查更新;in-terval:X——每隔X分钟检查一次更新(X为任意整数)。

元素checksumPolicy:

用来配置Maven检查检验和文件的策略。当构件被部署到Maven仓库中时,会同时部署对应的校验和文件。在下载构件的时候,Maven会验证校验和文件,如果校验和验证失败,怎么办?当checksumPolicy的值为默认的warn时,Maven会在执行构建时输出警告信息,其他可用的值包括:fail——Maven遇到校验和错误就让构建失败;ignore——使Maven完全忽略校验和错误。

发布jar到私服

如果需要发布自己的jar到私服,就需要修改工程:

  • setting.xml
1
2
3
4
5
6
7
8
9
...
</servers>
<server>
<id>nexus</id>
<username>admin</username>
<password>teadmin</password>
</server>
</servers>
...
  • pom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
<distributionManagement>
<repository>
<!-- 此处id随意取,但必须和setting.xml中server下的id对应上 -->
<id>nexus</id>
<name>Releases</name>
<url>http://<nexus_host>:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus</id>
<name>Snapshot</name>
<url>http://<nexus_host>:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>

注意上面的repository的id值一定要跟settings.xml文件中配置的server一致。

这里使用SpringBoot的starter项目作为测试。

部署到快照版仓库【后缀:SNAPSHOT】

将jar包部署到快照仓库,
pom.xml中的版本配置为0.0.1-SNAPSHOT,
标识为快照。

部署到发行版仓库【后缀:RELEASE,也可以只用版本号】

将jar包部署到发行版仓库,
pom.xml中的版本配置为0.0.1-RELEASE,
标识为发行版,也可以只用版本号,如0.0.1。

  • 成功标识:

查看仓库

完成Nexus Repository私有仓库部署,登录私仓后,可以看到多个仓库,
仓库分类如下表所示,

序号仓库描述
1maven-central中央仓库,默认从https://repo1.maven.org/maven2/ 拉取软件包,可配置
2maven-public公共仓库,存储发行版和快照版的软件包,即发行版和快照版的软件包都会在public中
3maven-releases发行版仓库,软件包稳定后,发布到该仓库,团队内使用
4maven-snapshots快照版本仓库,用于测试软件,发布到线上

小记:执行指令上传jar到Nexus

  • 本地开发完的jar可以直接执行deploy
1
mvn clean deploy
  • 第三方Jar上传到Nexus
1
2
3
4
5
6
7
8
mvn deploy:deploy-file \
-DgroupId=<group-id> \
-DartifactId=<artifact-id> \
-Dversion=<version> \
-Dpackaging=<type-of-packaging> \
-Dfile=<path-to-file> \
-DrepositoryId=<server-id-settings.xml> \
-Durl=<url-of-the-repository-to-deploy>

-DrepositoryId的值即为在setttings.xml里面配置的server id。

使用私服中的依赖

在项目中添加私有仓库的地址,
通过repositories属性,与dependencies属性同级。
再引入对应的jar包Maven坐标,
配置样例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<repositories>
<repository>
<id>nexus</id>
<url>http://<nexus_host>:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.monkey</groupId>
<artifactId>template-spring-boot-starter</artifactId>
<version>0.0.1-RELEASE</version>
</dependency>
</dependencies>