一、背景
公司计划做devops技术栈,在制品库选型时选择了SonatypeNexus作为制品管理工具。Sonatype nexus 是sonatype公司的一款制品管理工具,自身提供了OSS 开源免费版及PRO商业版,同时nexus自身具有多方面的优势,首先,管理制品种类多,可以管理maven,docker,npm,go等主流语言的制品,同时在权限配置和用户配置上具有的优势,可以实现针对制品的降权处理。同时官方也提供了丰富的api文档,可以灵活的针对nexus进行二次开发,实现devops工具的多种需求。
二、工具下载
Nexus提供了二进制部署及镜像部署这两种方式,首先二进制部署可通过https://help.sonatype.com/repomanager3/download/download-archives---repository-manager-3 下载,镜像可通过https://hub.docker.com/r/sonatypenexus3/tags/ 进行下载。PS:1、站点在国外,所以二进制下载常常会出现下载失败的现象,这个可以可以通过反复下载赌运气,或者是买一个其他地区的服务器转发(成本好高呀)2、镜像下载就好多了,可以通过阿里云的加速器,下载速度还是让人可以接受的。
三、服务部署
3.1 部署需求
官方建议配置如下
CPU:最少为4,推荐为8+
内存:建议8G起步,规模大可考虑16G甚至是32G+
JAVA:JDK8
句柄数:至少为65536
磁盘空间:多多益善,官方建议500G
综合考虑我公司现状,nexus配置为
CPU:8核
内存:16G
存储:500G
3.2 服务部署
部署这里共探索了两种主流方案,方案如下
方案一、二进制部署
1、 创建程序用户
useradd nexus
2、 修改句柄数
在 /etc/security/limits.conf 中添加
nexus - nofile 65536
3、 重启服务
reboot
4、 部署java
tar zvxf jdk-8u231-linux-x64.tar.gz
mv jdk-8u231 /opt/jdk
修改 /etc/profile
export JAVA_HOME=/opt/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
保存后执行 source /etc/profile
5、 部署nexus
cd /opt
wget http://download.sonatype.comnexus/3nexus-3.24.0-02-unix.tar.gz
tar zvxf nexus-3.24.0-02-unix.tar.gz
mv nexus-3.24.0-02 nexus
cd nexus/bin
在nexus 中修改第14行
INSTALL4J_JAVA_HOME_OVERRIDE=
为java的部署路径否则有概率启动报错
在nexus.rc中修改为
run_as_user=”nexus”
在/optnexus/etcnexus-default.properties中可修改默认端口(可选)
修改文件权限
chown -R nexus:nexus /optnexus
chown -R nexus:nexus /opt/sonatype-work
切换用户,启动服务
su nexus
cd /optnexus/bin
.nexus start
方案二 容器部署
docker run \
-p 8081:8081 \
–name nexus \
–ulimit nofile=65536:65536 \
–restart always \
sonatypenexus3
即可完成部署
PS:一般情况下默认的登录信息为admin/admin123,不过有的时候会提示密码错误,这个时候就需要找一下/opt/sonatype-worknexus3目录下的admin.password文件,使用该密码登陆后会提示用户设置admin密码。
两种部署方案均做过尝试后,决定采用方案一中作为公司使用方案
1、nexus在使用中需要频繁读写,docker自身存在io低的短板,会降低nexus的效率
2、docker存在不稳定的短板,nexus作为公共工具,一旦出现问题将严重阻塞公司开发进度
3、nexus为工作目录和数据目录分离的架构设计,使用二进制部署可以轻松进行服务升级以及服务扩展(需要扩展备机时,将数据打包即可)
五、nexus配置
5.1 配置数据仓库
登录nexus后,可以按照如下顺序点击,即可创建私服仓库了
可以看到支持的存储种类是非常多的
仓库类型主要分为
proxy:代理公网上的仓库,比如maven的中央仓库,node的阿里镜像
hosted:本地仓库,一般是私有仓库,用于发布自己公司开发的制品
group:组,把几个仓库结合在一起,方便下载制品
5.1.1 创建proxy代理仓库
1、选择npm(proxy)
2、命名并输入代理地址,保存
3、本地配置npm config或npm install时指定为私服代理
4、安装成功后产看代理仓库,发现已经缓存下来刚刚安装的node依赖了
5.1.2 创建hosted仓库
创建maven(hosted)
选择maven2(hosted)仓库
配置仓库名,仓库中可保存包的version规则,上传规则后保存。
其中vesion规则里面,release为发布版,snapshot为快照版,mixed为混合,建议release和snapshot分开保存,同时严格遵守版本规则。其中发布版release突出其稳定性,所以禁止redeploy,如果包变更,请升级版本号。
配置完毕的仓库(私服)
PS:上传jar包
方案一:有项目源码时,通过maven命令,打包源码后上传,在构建时,可在settings.xml中配置Repository标签和server标签,然后通过mvn deploy命令上传到对应私服仓库。
方案二:通过调用接口上传
POST /service/rest/v1/components
curl -v -u admin:admin123 -X POST ‘http://192.168.1.62:8081/repository/example_maven_release/' -F maven2.groupId=com.google.guava -F maven2.artifactId=guava -F maven2.version=24.0-jre -F maven2.asset1=@guava-24.0-jre.jar -F maven2.asset1.extension=jar -F maven2.asset2=@guava-24.0-jre-sources.jar -F maven2.asset2.classifier=sources -F maven2.asset2.extension=jar
方案三:在只有j制品时,通过maven命令直接上传
mvn deploy:deploy-file -Dfile=guava-24.0-jre.jar -DpomFile=guava-24.0-jre.pom -Dpackaging=jar -DrepositoryId=bxbank_privrepository_snapshots -Durl=http://192.168.1.62:8081/repository/example_maven_release/
5.1.3 创建group
创建npm(group)
npm因自身有多个代理可选择,所以可以选择group的模式来实现配置后可从多个npm代理中下载依赖的目的
配置组名及npm组中需要的代理及私服
配置完毕
PS:配置组(group)主要是为了方便用户拉取依赖
5.2 用户配置
5.2.1 创建角色
按下图依次点击进入roles界面
根据仓库分别创建ReleaseUploader,SnapshotUploader,NpmUploader的角色
在创建权限时,可通过搜索功能缩小范围,如图搜索npm,在这里会发现根据创建的example_npm仓库,出现了对应的规则,例如nx-repository-admin-npm-example_npm-* ,需要将这些规则移动到右侧,再点击保存即可。同理可创建ReleaseUploader,
至此,角色创建完毕
5.2.2 创建账号
按照下图顺序进入users界面
点击create local user,依次输入用户名,email,密码等,并配置之前创建的角色
配置基本信息
配置角色并设计帐号状态为激活
并以相同的方式创建ReleaseUploader和SnapshotUploader,至此,公共账号创建完毕,可依照此方案创建所需要的帐号。
六、高可用方案
nexus因其自身有pro,并且将HA配置在了pro版,所以只能走野路子了。网上可以找到的方案为rsync,不过这个方案服务器负载过高,不太实用,所以采用另一个方案了。
个人设计的方案为全量备份,备机高速恢复服务策略:
1、每天定时全量备份(夜晚),全备保存三份即可
2、nexus访问通过域名访问
3、出现问题,通过备份数据重启服务即可
方案缺陷:
1、会缺失全备时间点到当前时间点的制品
2、服务恢复需要一定时间,无法做到无感知
- 本文作者: Devops旭
- 本文链接: http://yoursite.com/2019/08/06/SonatypeNexus你需要知道的那些事儿/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!