前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Nexus做java,nodejs的制品库和内网加速

使用Nexus做java,nodejs的制品库和内网加速

原创
作者头像
iginkgo18
修改2021-09-09 14:48:39
1.6K0
修改2021-09-09 14:48:39
举报
文章被收录于专栏:devops_k8sdevops_k8s

Maven简介

maven是一个项目管理和综合工具,提供给开发人员构建一个完整的生命周期框架;

开发团队可以自动完成该项目的基础设施建设, maven使用标准的目录结构和默认构建生命周期;

apache开源项目主要服务于java平台构建,依赖项目,项目管理;

Project Object Model,项目对象模型。通过xml格式保存的pom.xml文件。

该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。该文件是由开发维护,我们运维人员可以不用去关心。

mvn package # 会去maven的中央仓库去下载需要的依赖包和插件到.m2目录下

Nexus3私服简介

私服是架设在区域网的一种特殊远程仓库, 目的是代理远程仓库及部署第三方构件, 有了私服之后, 当maven需要下载构件时,直接请求私服, 私服上存在则下载本地仓库, 否则私服请求外部的远程仓库, 将构件下载到私服, 再提供给本地仓库下载;

nexus是一个强大的maven仓库管理器,它极大的简化了本地内部仓库的维护和外部仓库的访问.

nexus是一套开箱即用的系统不需要数据库,它使用文件系统加Lucene来组织数据

nexus使用ExtJS来开发界面,利用Restlet来提供完整的REST APIs,通过IDEA和Eclipse集成使用

nexus支持webDAV与LDAP安全身份认证.

nexus提供了强大的仓库管理功能,构件搜索功能,它基于REST,友好的UI是一个extjs的REST客户端,占用较少的内存,基于简单文件系统而非数据库.

为什么使用私服及工作流程
  • 节省外网带宽。
  • 加速Maven构建。
  • 部署第三方构件。
  • 提高稳定性,增强控制。
  • 降低中央仓库的负荷。
  • 控制和审计
  • 建立本地内部公用仓库

工作流程

仓库类型介绍

hosted,本地仓库,通常我们会部署自己的构件到这一类型的仓库。比如公司的第二方库;

proxy,代理仓库,它们被用来代理远程的公共仓库,如maven中央仓库;

group,仓库组,用来合并多个hosted/proxy仓库,当你的项目希望在多个repository使用资源时就不需要多次引用了,只需要引用一个group即可;

管理本地仓库

我们前面讲到类型为hosted的为本地仓库,Nexus预定义了3个本地仓库,分别是Releases, Snapshots, 3rd Party. 分别讲一下这三个预置的仓库都是做什么用的:

Releases: 这里存放我们自己项目中发布的构建, 通常是Release版本的, 比如我们自己做了一个FTP Server的项目, 生成的构件为ftpserver.war, 我们就可以把这个构建发布到Nexus的Releases本地仓库. 关于符合发布后面会有介绍.

Snapshots:这个仓库非常的有用, 它的目的是让我们可以发布那些非release版本, 非稳定版本, 比如我们在trunk下开发一个项目,在正式release之前你可能需要临时发布一个版本给你的同伴使用, 因为你的同伴正在依赖你的模块开发, 那么这个时候我们就可以发布Snapshot版本到这个仓库, 你的同伴就可以通过简单的命令来获取和使用这个临时版本.

3rd Party:顾名思义, 第三方库, 你可能会问不是有中央仓库来管理第三方库嘛,没错, 这里的是指可以让你添加自己的第三方库, 比如有些构件在中央仓库是不存在的. 比如你在中央仓库找不到Oracle 的JDBC驱动, 这个时候我们就需要自己添加到3rdparty仓库。

部署maven

代码语言:javascript
复制
# 解压部署
[root@jenkins-2 ~]# tar xf apache-maven-3.6.2-bin.tar.gz 
[root@jenkins-2 ~]# mv apache-maven-3.6.2/* /opt/maven/
[root@jenkins-2 ~]# tail -3 /etc/profile
JAVA_HOME=/usr/local/jdk
export JRE_HOME=/usr/local/jdk/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export MAVEN_HOME=/opt/maven
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$MAVEN_HOME/bin:$PATH
[root@jenkins-2 ~]# source /etc/profile

# 测试maven是否安装成功
[root@jenkins-2 ~]# mvn -v
Apache Maven 3.6.2 (40f52333136460af0dc0d7232c0dc0bcf0d9e117; 2019-08-27T23:06:16+08:00)
Maven home: /opt/maven
Java version: 1.8.0_121, vendor: Oracle Corporation, runtime: /usr/java/jdk1.8.0_121/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-514.el7.x86_64", arch: "amd64", family: "unix"
打包流程命令
代码语言:javascript
复制
 validate(验证): 验证项目正确,而且全部必要信息可用。compile(编译): 编译项目源码
 test(测试): 使用合适的单元测试框架测试编译后的源码。
 package(打包): 源码编译以后,使用合适的格式(例如JAR格式)对编译后的源码进行打包。integration-test(集成测试): 若是有须要,把包处理并部署到能够运行集成测试的环境中去。verify(验证): 进行各类测试来验证包是否有效而且符合质量标准。
 install(安装): 把包安装到本地仓库,使该包能够做为其余本地项目的依赖。
 deploy(部署): 在集成或发布环境中完成,将最终软件包复制到远程存储库,以与其余开发人员和项目共享。
 clean (清除) : 清除上次编译的结果
example

部署Nexus3

安装解压
代码语言:javascript
复制
tar xf nexus-3.13.0-01-unix.tar.gz -C /opt/
启动
代码语言:javascript
复制
cd /opt/nexus-3.13.0-01/bin/
./nexus start

# 验证端口
lsof -i:8081
COMMAND   PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
java    23141 root  752u  IPv4 59496716      0t0  TCP *:tproxy (LISTEN)
java    23141 root  756u  IPv4 59520286      0t0  TCP client-1:tproxy->123.112.188.190:10250 (ESTABLISHED)

# 查看日志
tailf  /opt/sonatype-work/nexus3/log/nexus.log |head -10
登录

点击右上角的sign in登录,输入账户

admin/admin123

仓库介绍

点击“设置-Repositories”,就可以看到仓库,分三种类型:

  • proxy:是远程仓库的代理。比如说在nexus中配置了一个central repository的proxy,当用户向这个proxy请求一个artifact,这个proxy就会先在本地查找,如果找不到的话,就会从远程仓库下载,然后返回给用户,相当于起到一个中转的作用。    
  • Hosted:是宿主仓库,用户可以把自己的一些构件,deploy到hosted中,也可以手工上传构件到hosted里。比如说oracle的驱动程序,ojdbc6.jar,在central repository是获取不到的,就需要手工上传到hosted里,一般用来存放公司自己的jar包;
  • Group:是仓库组,在maven里没有这个概念,是nexus特有的。目的是将上述多个仓库聚合,对用户暴露统一的地址,这样用户就不需要在pom中配置多个地址,只要统一配置group的地址就可以了右边那个Repository Path可以点击进去,看到仓库中artifact列表。不过要注意浏览器缓存,当你的项目希望在多个repository使用资源时就不需要多次引用了,只需要引用一个group即可;

maven-public:maven-central、maven-release和maven-snapshot三个库的合集;

maven-release:用来存放release版本的jar包;

maven-snapshot:用来存放snapshot版本的jar包。

关于Maven的Snapshot版本与Release版本

1 . Snapshot版本代表不稳定、尚处于开发中的版本

2 . Release版本则代表稳定的版本

3 . 什么情况下该用SNAPSHOT? 协同开发时,如果A依赖构件B,由于B会更新,B应该使用SNAPSHOT来标识自己。这种做法的必要性可以反证如下:

a.如果B不用SNAPSHOT,而是每次更新后都使用一个稳定的版本,那版本号就会升得太快,每天一升e68a84e8a2ade79fa5e9819331333363396362甚至每个小时一升,这就是对版本号的滥用。

b.如果B不用SNAPSHOT, 但一直使用一个单一的Release版本号,那当B更新后,A可能并不会接受到更新。因为A所使用的repository一般不会频繁更新release版本的缓存(即本地repository),所以B以不换版本号的方式更新后,A在拿B时发现本地已有这个版本,就不会去远程Repository下载最新的B;

4 . 不用Release版本,在所有地方都用SNAPSHOT版本行不行? 不行。正式环境中不得使用snapshot版本的库。 比如说,今天你依赖某个snapshot版本的第三方库成功构建了自己的应用,明天再构建时可能就会失败,因为今晚第三方可能已经更新了它的snapshot库。你再次构建时,Maven会去远程repository下载snapshot的最新版本,你构建时用的库就是新的jar文件了,这时正确性就很难保证了;

Java 使用Nexus制品库

向nexus3私服上传jar包

创建环境

至此创建仓库完成

创建管理用户

测试上传Jar包

登录 2/password,点击upload

Java使用Nexus做内网加速仓库

本地拉取依赖包

maven全局配置

修改Nexus默认认证信息(132行注释下加)

代码语言:javascript
复制
vim /opt/maven/conf/settings.xml
    <server>
        <id>my-nexus-releases</id>
        <username>admin</username>
        <password>admin123</password> 
      </server>
      <server>
        <id>my-nexus-snapshot</id>
        <username>admin</username>
        <password>admin123</password>
      </server>

再修改server标签后添加镜像: 168行下

代码语言:javascript
复制
    <mirror>
      <!--This sends everything else to /public -->
      <id>nexus</id>
      <mirrorOf>*</mirrorOf>
      <url>http://192.168.0.7:8081/repository/maven-public/</url>
    </mirror>

在修改mirrir标签后添加仓库信息,最下面几行

代码语言:javascript
复制
  <id>nexus</id>
  <!--Enable snapshots for the built in central repo to direct -->
  <!--all requests to nexus via the mirror -->
  <repositories>
    <repository>
      <id>central</id>
      <url>http://192.168.0.7:8081/repository/maven-public/</url>
      <releases><enabled>true</enabled></releases>
      <snapshots><enabled>true</enabled></snapshots>
    </repository>
  </repositories>
 <pluginRepositories>
    <pluginRepository>
      <id>central</id>
      <url>http://192.168.0.7:8081/repository/maven-public/</url>
      <releases><enabled>true</enabled></releases>
      <snapshots><enabled>true</enabled></snapshots>
    </pluginRepository>
  </pluginRepositories>
  </profiles>

激活仓库, profiles下面

代码语言:javascript
复制
<activeProfiles>
  <!--make the profile active all the time -->
  <activeProfile>nexus</activeProfile>
</activeProfiles>
测试拉取信息是否是走的本地仓库

NodeJS使用Nexus制品库

创建存储空间

创建仓库

仓库类型

hosted(私有仓库): 发布个人开发的npm组件;

proxy(代理仓库): 可以代理npm和淘宝镜像;

group(组合仓库): 对外公开的仓库,集合hosted和proxy;

创建Hosted npm Registries私有仓库

创建Proxy npm Registries代理仓库

代理远程地址可以随便选,此处选https://registry.npm.taobao.org

创建Group NPM Registries组合仓库

选择要包括的仓库,越靠上优先级越高,如果私有仓库在上,用户下载npm包的时候会优先下载私有仓库中的,如果私有仓库没有再去代理仓库中下载。

创建用户并设置权限

使用私服发布私服NPM

用户设置npm的registry为group仓库

代码语言:javascript
复制
npm config set registry http://私服ip:8081/repository/private-npm-group/

登录用户账号

代码语言:javascript
复制
npm login -registry=http://npm私服所在服务器的ip地址:8081/repository/private-npm-hosted/

输入用户名,密码,邮箱

用户发布npm包到私服

代码语言:javascript
复制
npm publish -registry=http://npm私服所在服务器的ip地址:8081/repository/private-npm-hosted/


校验是否成功
[root@client-1 js_design_node_usersrv]# npm publish -registry=http://42.193.126.123:8081/repository/private-npm-hosted/
npm notice 
npm notice 📦  docker_web_app@1.0.0
npm notice === Tarball Contents === 
npm notice 190B   Dockerfile  
npm notice 11.3kB Jenkinsfile 
npm notice 168B   server.js   
npm notice 265B   package.json
npm notice 52B    README.md   
npm notice 1.7kB  deploy.yaml 
npm notice === Tarball Details === 
npm notice name:          docker_web_app                          
npm notice version:       1.0.0                                   
npm notice package size:  4.3 kB                                  
npm notice unpacked size: 13.7 kB                                 
npm notice shasum:        e4bf3efd0754eb01410f8287af71931da02babc0
npm notice integrity:     sha512-ficCekkzCO3Dz[...]iucfiOoQvuRGA==
npm notice total files:   6                                       
npm notice 
+ docker_web_app@1.0.0

NodeJS使用Nexus内网加速

设置npm源地址

代码语言:javascript
复制
npm config set registry http://私服ip:8081/repository/private-npm-group/

example1

代码语言:javascript
复制
# 登录nexus
[root@client-1 js_design_node_usersrv]# npm login -registry=http://42.193.126.123:8081/repository/private-npm-hosted/
Username: 3
Password: 
Email: (this IS public) 18621048481@163.com
Logged in as 3 on http://42.193.126.123:8081/repository/private-npm-hosted/.

# 使用内网仓库下载
[root@client-1 js_design_node_usersrv]# npm --registry http://42.193.126.123:8081/repository/private-npm-group/ install
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN docker_web_app@1.0.0 No repository field.
npm WARN docker_web_app@1.0.0 No license field.

added 50 packages from 37 contributors in 6.088s


# 第二次下载走内网缓存可以发现快了很多
[root@client-1 js_design_node_usersrv]# npm --registry http://42.193.126.123:8081/repository/private-npm-group/ install
npm WARN docker_web_app@1.0.0 No repository field.
npm WARN docker_web_app@1.0.0 No license field.

up to date in 0.456s

Nexus集成Ldap做权限

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Maven简介
  • Nexus3私服简介
    • 为什么使用私服及工作流程
      • 仓库类型介绍
        • 管理本地仓库
        • 部署maven
          • 打包流程命令
            • example
            • 部署Nexus3
              • 安装解压
                • 启动
                  • 登录
                  • 仓库介绍
                  • Java 使用Nexus制品库
                    • 向nexus3私服上传jar包
                      • 创建环境
                      • 创建管理用户
                      • 测试上传Jar包
                  • Java使用Nexus做内网加速仓库
                    • 本地拉取依赖包
                      • maven全局配置
                      • 测试拉取信息是否是走的本地仓库
                  • NodeJS使用Nexus制品库
                    • 创建存储空间
                      • 创建仓库
                        • 仓库类型
                      • 创建Hosted npm Registries私有仓库
                        • 创建Proxy npm Registries代理仓库
                          • 创建Group NPM Registries组合仓库
                            • 创建用户并设置权限
                              • 使用私服发布私服NPM
                                • 登录用户账号
                                  • 用户发布npm包到私服
                                  • NodeJS使用Nexus内网加速
                                  • Nexus集成Ldap做权限
                                  相关产品与服务
                                  对象存储
                                  对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
                                  领券
                                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档