工欲善其事,必先利其器。
本文主要总结团队协助中,Nexus私有Maven环境搭建。
下文将分docker环境以及单机环境分别说明
Docker版安装
环境准备
Docker 环境安装
在Linux服务器上安装Docker环境,具体可以参考:https://docs.docker.com/engine/install/ubuntu/
开放端口号
#开放9004端口号
firewall-cmd --zone=public --add-port=9004/tcp --permanent
#重载防火墙规则
sudo firewall-cmd --reload
Nexus工作目录
/data/platform/02_nexus3/workspace
安装配置
Docker环境下安装Nexus
参考https://github.com/sonatype/docker-nexus3
获取nexus镜像
docker pull sonatype/nexus3
运行nexus
绑定配置
docker run \
--name nexus \
-d \
-u root \
--restart=always \
-m 4g \
-p 9004:8081 \
-p 9005:9005 \
-p 9006:9006 \
-p 9007:9007 \
-v /data/platform/02_nexus/workspace:/nexus-data \
-e "INSTALL4J_ADD_VM_PARAMS=-Xms128m -Xmx512m -XX:MaxDirectMemorySize=512m -Djava.util.prefs.userRoot=/nexus-data/javaprefs" \
sonatype/nexus3
访问jenkins容器
docker exec -it nexus bash
查看日志
docker logs -f nexus
查看镜像与容器信息
docker images # 查看镜像
docker ps -a # 查看所有容器服务的状态
docker port nexus # 查看端口映射
docker inspect nexus #查看容器的具体信息
登录及基础配置
登录nexus
Docker运行nexus成功后,访问:http://ip:port ,第一次登录需要输入管理员密码
异常处理
数据库read only
docker exec -u root -it nexus /bin/bash
find / -name nexus-orient-console.jar
java -jar /opt/sonatype/nexus/lib/support/nexus-orient-console.jar
连接数据库:
CONNECT PLOCAL:/nexus-data/db/component admin admin
#导出数据库
orientdb {db=component}> EXPORT DATABASE /nexus_db_backup/orientdb-component.export
#关闭数据库连接
orientdb {db=component}> DISCONNECT
#删除有问题的数据库
orientdb> DROP DATABASE PLOCAL:/nexus-data/db/component admin admin
#重新创建有问题的数据库
orientdb> CREATE DATABASE PLOCAL:/nexus-data/db/component admin admin
#导入数据库
orientdb {db=component}> IMPORT DATABASE /nexus_db_backup/orientdb-component.export.gz
#关闭数据库连接
orientdb {db=component}> DISCONNECT
#退出控制台
orientdb> EXIT
单机版安装
环境说明
安装服务器:
3.163-CentOS release 6.10 (Final)
安装路径:/usr/local/nexus3
访问 Nexus 官网(点击访问),打开下载页面,选择对应版本的下载包下载
cd /usr/local
wget https://download.sonatype.com/nexus/3/latest-unix.tar.gz
将下载下来的压缩包上传到服务器(比如 /usr/local 目录下),然后进行解压
tar -zxf nexus-3.16.1-02-unix.tar.gz
配置
默认端口为8081,我们可以按需修改配置文件nexus-3.16.1-02/etc/nexus-default.properties
application-port=8081
然后执行如下命令开放 8081 端口:
firewall-cmd --permanent --add-port=8081/tcp
firewall-cmd --reload
启动服务
./nexus-3.16.1-02/bin/nexus start
作为服务运行
链接 $installdir/bin/nexus
to /etc/init.d/nexus
:
sudo ln -s /usr/local/nexus-3.16.1-02/bin/nexus /etc/init.d/nexus
chkconfig配置
cd /etc/init.d
sudo chkconfig --add nexus
sudo chkconfig --levels 345 nexus on
sudo service nexus start
使用说明
账号设置
只有管理员有权限新增用户
顶部设置按钮->Security->Users-Ceate Local User
创建仓储
以maven仓储为例
默认仓库说明:
- maven-central:maven 中央库,默认从 https://repo1.maven.org/maven2/ 拉取 jar
- maven-releases:私库发行版 jar,初次安装请将 Deployment policy 设置为 Allow redeploy
- maven-snapshots:私库快照(调试版本)jar
- maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,在本地 maven 基础配置 settings.xml 或项目 pom.xml 中使用
仓库类型说明:
- group:这是一个仓库聚合的概念,用户仓库地址选择 Group 的地址,即可访问 Group 中配置的,用于方便开发人员自己设定的仓库。maven-public 就是一个 Group 类型的仓库,内部设置了多个仓库,访问顺序取决于配置顺序,3.x 默认为 Releases、Snapshots、Central,当然你也可以自己设置。
- hosted:私有仓库,内部项目的发布仓库,专门用来存储我们自己生成的 jar 文件
- snapshots:本地项目的快照仓库
- releases: 本地项目发布的正式版本
- proxy:代理类型,从远程中央仓库中寻找数据的仓库(可以点击对应的仓库的 Configuration 页签下 Remote Storage 属性的值即被代理的远程仓库的路径),如可配置阿里云 maven 仓库
- central:中央仓库
已配置仓储
Maven-android
http://localip:9004/repository/maven-public-android/
Maven-android-release
http://localip:9004/repository/avit-android-release/
Maven-android-snapshot
http://localip:9004/repository/avit-android-snapshot/
拉取制品
以Android为例
打开项目根目录build.gradle
buildscript {
repositories {
maven{
url 'http://localip:9004/repository/maven-public-android/'
}
}
......
}
allprojects {
repositories {
maven{
url 'http://localip:9004/repository/maven-public-android/'
}
}
}
上传制品
以AndroidStudio为例子
编辑待上传子模块build.gradle
,添加如下内容
ext.GROUP="top.lairdli.testaar"
//ext.VERSION_NAME="1.0.0-SNAPSHOT"
ext.VERSION_NAME = PUBLISH_VERSION
ext.POM_ARTIFACT_ID="testaar"
apply from: "${rootProject.ext.nexusMavenUploadScript}"
其中PUBLISH_VERSION定义在gradle.properties
//发布版本
#PUBLISH_VERSION=1.0.0-SNAPSHOT
其中 rootProject.ext.artifactoryMavenUploadScript
定义在根build.gradle
中
ext {
artifactoryMavenUploadScript = rootProject.file("config/upload/uploadMavenNexus.gradle")
}
uploadMavenNexus.gradle内容为
apply plugin: 'maven'
afterEvaluate { project ->
uploadMaven
}
task uploadMaven(group: "upload") {
upload("uploadMavenNexus");
dependsOn(uploadMavenNexus)
}
void upload(String name) {
String path = rootProject.ext.mavenUploadDir + "/" + name + ".properties"
task "$name"(type: UploadTask, group: "upload") {
if (path != null) {
propertiesPath = path;
}
versionName = VERSION_NAME;
group = GROUP;
id = POM_ARTIFACT_ID;
parsePropertiesConfig()
configuration = configurations.archives
repositories {
repositories.mavenDeployer {
repository(url: url) {
authentication(
userName: userName,
password: passWord
)
}
pom.groupId = group
pom.artifactId = id
pom.version = versionName
}
}
}
}
class UploadTask extends Upload {
String propertiesPath
def config
String url
String userName;
String passWord
String group
String id
String versionName
@TaskAction
def parsePropertiesConfig() {
println "---------------------->>>>>>>>>>>UploadTask<<<<<<<<<<<<----------------------"
println "UploadTask---> propertiesPath: $propertiesPath"
config = new ConfigSlurper().parse(new File(propertiesPath).toURL())
url = versionName.endsWith("-SNAPSHOT") ? config.snapshotRepositoryUrl
: config.releaseRepositoryUrl
userName = config.userName
passWord = config.passWord
println "UploadTask---> url: $url"
println "UploadTask---> userName: $userName"
println "UploadTask---> password: $passWord"
println "UploadTask---> archives: $group:$id:$versionName"
}
}
uploadMavenNexus.properties配置相关账号信息
mavenUrl="http://localip:9004/repository/maven-public-android/"
releaseRepositoryUrl="http://localip:9004/repository/avit-android-release/"
snapshotRepositoryUrl="http://localip:9004/repository/avit-android-snapshot/"
userName="xxx"
passWord="xxx"
参考
-
https://www.sonatype.com/download-nexus-repo-oss
-
https://help.sonatype.com/repomanager3
-
https://help.sonatype.com/docs
-
https://www.hangge.com/blog/cache/detail_2844.html