Nexus

1,787 阅读10分钟

启动Nexus

docker pull sonatype/nexus3 
mkdir -p /docker/nexus/ 
chmod -R 777 /docker 
docker run -d -p 8081:8081 -p 8082:8082 --privileged=true -v /docker/nexus/nexus-data:/nexus-data --name nexus sonatype/nexus3

权限控制

add 允许权限添加仓库或脚本。

browse 允许权限查看相关仓库的内容。不同于 read,拥有 browse 的权限类型只能在页面上查看和管理仓库内容。

create 允许权限在仓库管理器中创建适用的配置。因为需要 read 查看配置内容,所以 read 关联了绝大多数的现有的 create 。

delete 允许权限删除仓库管理器的配置、仓库内容、脚本。因为删除前需要先有 read 查看配置内容,所以一般用 read 关联 delete action。

edit 允许权限修改关联的脚本、仓库内容、仓库管理配置内容。

read 允许权限查看各种配置列表和脚本。如果没有 read,任何关联的 action 都会允许查看这些列表,但不允许查看其内容。read 也允许权限利用“能够从命令行查看内容”的工具。

update 允许权限更新仓库管理器配置。绝大多数现有的拥有 update 的权限也拥有 read action。因此,如果创建自定义的拥有 update 的权限,创建者应该考虑同时添加 read 到该权限,以便查看仓库管理器配置的更新。


nexus3默认是让游客访问、下载的,我们为了安全着想,需要关闭此功能,配置新的帐号让开发者和运维者使用,关闭方法如下:

配置Roles权限

nexus3需要先配置角色,在配置用户来分配权限。

配置开发者权限如下

只需要仓库的view-maven2的browse(访问)、read(读取权限),需要配置public、releases、aliyun三个仓库的读取,访问。然后在下面添加角色即可

image.png

roles配置开发者下载权限.png

这里都需要要添加nx-search-read权限,给用户查找功能

配置用户

配置完毕角色后,添加用户,把角色放入用户即可 作者:CaptainWhite
链接:www.jianshu.com/p/ee5d0201b…
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

特殊权限设置介绍

  • admin 用于管理设置界面
  • view 用于管理browse 界面

分组仓库只能拉代码,不能增删改

简述

在上一个视频,我介绍了如何封装自己的SpringBoot Starter。B站视频-自定义starter

你可能有想法去对某个功能做封装,使其成为一个自定义starter。但思考这样一个问题:

你正在开发一个项目,正好可以使用你自定义的starter,于是你将其引入到了项目中。如果你一直在你自己的电脑上开发的话,那没有什么问题。但是如果你换了电脑或者别人要协同你开发,重新从git上拉下代码,是下载不到你自定义的starter依赖的,因为starter一直都在你的本地maven仓库!

所以,无论对于个人还是公司,有一个私有maven仓库是很便利的。你不仅仅能将你的starter上传上去,还能将普通的maven项目上传上去,更重要的是你的代码永远在自己手中而不必暴露出去。

私有maven仓库的实现:NEXUS。你可能已经见过它了,阿里的镜像仓库也是用它做的。在maven的setting.xml中的阿里镜像中就有“nexus”一词。

技术前提

对于屏幕前的小伙伴,希望你们有一些关于:maven、docker的基础知识。如果有自己的服务器就更好了,没有的话windows也可以。

硬性要求就是需要安装Docker。(Linux安装docker:blog.csdn.net/qq_42682745…

当然,我的视频风格就是:白话路线,所以只要你想学这个知识,你都能继续往下看。

安装nexus

镜像地址:hub.docker.com/r/sonatype/…

拉一个最新的:

docker pull sonatype/nexus3:latest

拉取下来后就是运行了,我们需要知道,我们上传上去的数据很重要,所以仓库一定要映射出来。

而且,nexus也是java项目,它的默认参数是:-Xms2703m -Xmx2703m -XX:MaxDirectMemorySize=2703m -Djava.util.prefs.userRoot=${NEXUS_DATA}/javaprefs,服务器内存可能不够起不起来,所以改小一点(我踩坑了)。

很重要的一点:如果你的nexus能启动但是报错停止运行,那么大概率是因为你第一次启动内存不足而导致orientdb数据库损坏,最简单的做法是是删除nexus容器,删除nexus镜像,删除数据卷(docker volume ls docker volume rm nexus-data )。然后重新拉镜像,重新运行。我报错是Schema is not created and cannot be loaded DB name="config",然后参考了 他的方法很复杂

docker run -d -p 666:8081 --name nexus -e INSTALL4J_ADD_VM_PARAMS="-Xms512m -Xmx512m -XX:MaxDirectMemorySize=1200m" -v nexus-data:/nexus-data sonatype/nexus3

容器中expose的是8081端口,主机端口自行设置,比如我的666端口

因为启动比正常的容器要久一点,所以别急。可以查看日志:

docker logs -f nexus

启动成功后,浏览器ip+端口访问即进入该页面:

image-20221216202927663

这时,我们点击右上角登录(截图没截到)。用户名为admin,密码稍微麻烦一点。首先查看我们的匿名数据卷挂载的目录:docker volume inspect nexus-data

image-20221216203530523

然后进入这个目录有一个叫admin.password的文件,里面放的就是admin的登录密码。

使用cat admin.password查看密码,是一个随机字符串,登录成功后会让我们改密码的,不用担心记不住。

登陆后,会有四个设置步骤。

第一个直接next,

第二个就是设置新密码,

第三个询问我们是否允许匿名访问(就是外人能不能访问该站点),我们既然搭建私服,就不应该允许匿名访问,勾选disable,

第四个完成确认。

安装运行完成,下面就开始介绍如何使用nexus了。

仓库介绍

nexus仓库分三种类型

  • proxy 代理仓库,比如代理到maven中央仓库。
  • hosted 宿主仓库,即自己的私人仓库。
  • group 仓库组,由多个仓库组成,当要下载依赖时会遍历每个仓库去找。

其中,hosted 宿主仓库又分为:releases 和shapshots,分别表示依赖的版本的发行版、快照版。快照版依赖不能上传到发行版仓库,反之亦然。nexus做了限制。

仓库格式有两种

  • maven2
  • nuget

我们搞java的只需要关心maven2的就好了。

其实能猜到我们使用最多的就是仓库组,可以把代理仓库、releases 和shapshots一起放进去,这样就完美实现:能从私服下载依赖,找不到还能去代理仓库那找。我们只需要在本地maven中配置下载镜像从私服上的仓库组下载就行了。

仓库组

其默认的仓库组也是这样干的,把代理仓库、releases 和shapshots这三个仓库都放进去了。

image-20221216211904140

点击就能进去看仓库详情了:

image-20221216212017674

选择要操作的仓库,然后中间左右移动,就能向仓库组添加、移除仓库了。

代理仓库

默认创建好的代理仓库是代理到maven中心仓库的:

image-20221216212416513

点击进入可以看到:

image-20221216212455221

总所周知,国内在maven中心仓库下载依赖很慢,所以我们可以重新创建一个代理仓库,然后代理到阿里的镜像仓库:

image-20221216213105060

仓库类型很多,但我们只需要关心maven格式的即可:

image-20221216213158320

仓库名字、代理地址必填,其余可以默认值(存储类型根据需要,默认只保存release依赖,maximum那些是设置缓存时间的)

image-20221217122123557

阿里的镜像仓库地址:https://maven.aliyun.com/nexus/content/groups/public

创建完成后,把这个仓库放到仓库组里面,可以将ali的代理仓库放第一位。

大致操作就是这样的,下面开始本地maven配置。

上传依赖

首先找到本地maven的setting.xml,打开后找到servers标签。加入以下内容

  <servers>
    <!-- 这是配置访问私有仓库的用户名密码 -->
    <server>
      <!-- id标签可以随便填,只需要在servers中唯一即可,后面很多地方会使用该id -->
      <id>self-maven</id>
      <username>dev</username>
      <password>xpxp1998</password>
    </server>
      
  </servers>

用户名密码可在nexus设置中去创建用户,分配对应全新,不建议使用admin账号。

maven配置好了,接下来去maven项目中设置:

在你想上传的模块的pom文件中,写入:

<distributionManagement>
		
        <repository>
            <id>self-maven</id>
            <url>http://ip:port/repository/maven-releases/</url>
        </repository>

        <snapshotRepository>
            <id>self-maven</id>
            <url>http://ip:port/repository/maven-snapshots/</url>
        </snapshotRepository>
    
    </distributionManagement>
  • repository标签是代表上传release版本
  • snapshotRepository标签代表上传snapshot版本

会根据该模块的版本进行自动选择,如果你的版本号带有SNAPSHOT如:<version>0.0.1-SNAPSHOT</version>,那么会上传到SNAPSHOT仓库,release也是这个道理,如果版本号不存在这两个单词,如1.0.0,那么会选择release仓库上传。

标签中的 id,就是上面我们配置的server id,maven会通过这个id去server中拿用户名密码去访问私服仓库。

标签中的url,就是对应仓库的地址:仓库的url复制即可,注意对应仓库,弄反了是传不上去的

image-20221217121429949


ok,针对上传,我们已经配置好了,那么如何上传呢?

image-20221217121624800

在idea右侧,maven中,选择要上传的模块,点击deploy(发布)即可

image-20221217121823246

会先下载一些东西,然后上传。

发布后,在对应的仓库也能查看,我这里是snapshot仓库:

image-20221217121935851

上传到这里就可以了,但有一点需要注意的是,release仓库需要把

image-20221217125540079

设置为Allow redeploy代表允许我们对仓库中的依赖维护升级新版本,如果设置为disable redeploy意味着我们无法将升级版本上传上来。

下载依赖

接下来,配置本地maven。

还是打开setting.xml,找到mirrors标签。

然后添加一个mirror标签:

<mirror>
    <id>self-maven</id>
    <mirrorOf>*</mirrorOf>
    <url>仓库组的url/</url>
</mirror>

之前阿里的镜像可以注释了,

添加的镜像:

  • id 之前server的id,访问仓库组也要拿用户名密码
  • mirrorOf *代表所有的依赖都从私服找
  • url 就是仓库组的,还是去仓库组右边copy即可

到这里就能使用私服下载依赖了。

我们需要把之前创建的阿里镜像代理仓库放到仓库组中。

maven-public这个仓库组,把ali代理仓库加进去就行了:

image-20221217122754210

注意

关于nexus代理仓库状态

image-20221217131805013

online-remote available 表示该被代理仓库可用

online-ready to connect并不是代理仓库用不了。而是你根本还没有一个依赖去访问这个被代理仓库,nexus也不知道这个被代理仓库能不能用,所以它只能展示为待连接状态:

image-20221217132103203

该配置:表示代理仓库会根据每次请求被代理仓库的响应来决定是否暂停请求这个被代理仓库,请求无响应就会block。

image-20221217133404847

还有一个Blocked选项,直接阻止,相当于禁用该代理仓库。一般选择auto就行了。

所以 online-ready to connect并不是仓库出现了问题。

新建的代理仓库都是 online-ready to connect状态。

最好在maven配置中还是加上阿里镜像仓库

<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus aliyun</name>
    <url>https://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>