1. 前言
在前面的版本中,错误的把构建推送docker
镜像绑定到package
执行动作上面了;这样导致osc-service
父工程在install
操作时会报找不到依赖的错误,和“提前”构建推送镜像等不能接受的问题。为了解决这些问题,这个版本做了一些对应优化。
2. 源码
完整项目地址:https://github.com/intomylife/osc-api
v1.4.4 标签地址:https://github.com/intomylife/osc-api/releases/tag/v1.4.4
注:对于标签的说明「初学者商城」- 写在最前面 #5.1
3. 接口
注:查看更改内容:使用脚本简化部署操作
3.1 更改绑定执行动作
从package
更改为deploy
原因:
在package
阶段,命令只完成了项目编译、单元测试、打包功能,而没有安装部署到本地仓库和远程仓库;这时的package
动作由于是构建推送docker
镜像的“触发点”,就导致在本地仓库和远程仓库都没有相关依赖而报错的结果。
那是否能绑定在install
阶段?答案是否定的。install
在package
的项目编译、单元测试、打包功能基础上多一个安装部署到本地仓库的步骤,而我们是需要在此操作后才来进行docker
镜像的构建和推送。
所以,最后更改为绑定到deploy
阶段;其中deploy
阶段包括:项目编译、单元测试、打包功能、安装部署到本地仓库、安装部署到远程仓库。
3.2 远程私有仓库:Nexus
注:之前配置的阿里云镜像仓库地址供我们加速下载依赖,而这时想要安装部署到远程仓库,就需要自己部署一个Maven
的远程私有仓库
3.2.1 Nexus
Nexus
是一个强大的Maven
仓库管理器,它不仅能维护自己内部的所有依赖,同时还能代理外部的镜像仓库;安装容易上手简单,并且还提供可视化的操作界面。
下面我们一起在Docker
中安装Nexus3
3.2.2 Docker 中安装 Nexus3
- 拉取 Nexus 镜像
[root@zwc ~]# systemctl start docker.service
[root@zwc ~]# docker pull sonatype/nexus3:3.17.0
- 配置 Nexus 数据目录,以及赋予目录读写执权限
[root@zwc ~]# cd /usr/local/
[root@zwc local]# mkdir nexus-data
[root@zwc local]# chmod -R 777 nexus-data/
- 运行 Nexus 容器
[root@zwc ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sonatype/nexus3 3.17.0 36b0df681a47 11 months ago 582MB
[root@zwc ~]# docker run -d --name nexus3 --restart always -p 18081:8081 -e TZ='Asia/Shanghai' -v /usr/local/nexus-data/:/nexus-data/ sonatype/nexus3:3.17.0
56153e61cba379ea74be624396285f00c07d563b52ef0414cf253ad6
[root@test ~]#
- -d:后台启动
- –name:启动后的容器名称
- –restart:赋固定值 always,表示如果容器启动失败,会一直尝试重连
- -p:端口映射(宿主机端口:容器端口)
- -e:环境变量,指定了容器的时区
- -v:映射数据目录,相当于把容器中的数据备份到宿主机指定的目录(宿主机目录:容器目录)
- sonatype/nexus3:3.17.0:启动的镜像
3.2.3 更改 admin 密码
- 上面的步骤操作结束后,直接在浏览器中输入
ip:18081
- 顺利进入到
Nexus
主页后,点击右上角Sign in
按钮 - Username: admin
- Password: 密码在
admin.password
文件里面记录着
[root@zwc ~]# cd /usr/local/nexus-data/
[root@zwc nexus-data]# cat admin.password
- 成功登陆后,会有一个向导,用来重置
admin
密码 - 点击
Next
,输入两次新密码,继续Next
- 这一步提示是否需要开启匿名访问,为了安全起见不需要,继续
Next
- 最后点击
Finish
,完成
3.2.4 仓库类型
- proxy:代理类型;远程仓库的代理,当在自己内部仓库没有的情况下会去代理仓库中查找
- hosted:宿主类型;自己内部的仓库
- group:仓库组类型;配置多种类型的仓库,然后对外暴露统一的地址即可访问到这个组里所有的仓库
3.2.5 Policy 策略
在 hosted(宿主类型) 的仓库里,又有 Policy(策略) 的概念,主要分为以下两种:
- releases:线上发布的版本仓库
- snapshots:开发测试的版本仓库
3.2.6 默认的仓库
- maven-central:代理类型的仓库,默认代理的仓库地址是
https://repo1.maven.org/maven2/
- maven-releases:宿主类型的仓库,Policy 策略为 releases,指自己内部线上发布版本的仓库
- maven-snapshots:宿主类型的仓库,Policy 策略为 snapshots,指自己内部开发测试版本的仓库
- maven-public:仓库组,目前包含上面三个仓库
3.2.7 创建一个代理仓库
注:默认的仓库中只有一个Maven
中央仓库的代理,现在需要新建一个代理阿里云镜像的仓库
- 点击主页顶部像设置一样的图标按钮
- 在左侧展开
Repository
,选择Repositories
- 点击
Create repository
按钮,选择maven2 (proxy)
代理类型的仓库 - Name: aliyun-proxy
- Proxy -> Remote storage: http://maven.aliyun.com/nexus/content/groups/public
- 填写完上面两项就翻到页面最底部,点击
Create repository
按钮
3.2.8 把新建的代理仓库放入仓库组中
- 点击进入
maven-public
仓库组 - 找到
Group -> Member repositories:
处 - 两个大框框,左边显示的是还可以加入组中的仓库,右边显示的是已经加入到组中的仓库
- 现在把刚刚新建的代理仓库添加到组中
- 点击
aliyun-proxy
- 点击朝向右边的箭头(Add to Selected)
- 这时
aliyun-proxy
它就排在了最底下,上下排名是指访问的优先前后 - 这里需要把
aliyun-proxy
放在maven-central
前面 - 接着点击朝上边的箭头(Move Up)
- 最后点击页面最下方的
Save
按钮 - 等待页面的右上方会弹出相应的提示,显示
Success
等信息表示操作成功
3.2.9 健康检查
- 回到
Repositories
页面 - 发现代理仓库都有
Health check
项,现在来开启一下 - 点击
aliyun-proxy
仓库的Analyze
按钮 - 点击
Yes, only this repository
,仅仅就操作当前选择的仓库 - 点击
I Agree
,我同意 maven-central
仓库同上操作一遍
3.2.10 其他设置
部署策略:
maven-releases
仓库默认是不允许重新部署的,对于自己测试使用很不方便,所以这里更改为允许重新部署- 点击进入
maven-releases
仓库 - 找到
Hosted -> Deployment policy:
- 下拉选择
Allow redeploy
- 点击
Save
按钮,保存 - 等待页面的右上方会弹出相应的提示,显示
Success
等信息表示操作成功
日志报错:
- 点击主页顶部像设置一样的图标按钮
- 在左侧展开
System
,选择Capabilities
- 点击
Outreach: Management
进入到管理能力详情中 - 点击上方
Disable
按钮 - 等待页面的右上方会弹出相应的提示,显示
Success
等信息表示操作成功
3.3 配置本地 Maven 的 settings.xml
3.3.1 mirror 镜像
注:由于已经在远程私有仓库中配置了阿里云镜像仓库的地址,所以这里可以把已经配置的内容注释,再添加刚刚部署的远程私有仓库地址
<mirror>
<id>nexus3</id>
<mirrorOf>*</mirrorOf>
<name>maven-public</name>
<url>http://ip:18081/repository/maven-public/</url>
</mirror>
3.3.2 server 用户名密码
注:由于刚刚配置 Nexus 时设置的不允许匿名访问,所以这里还需要配置仓库的认证信息
<server>
<id>nexus3</id>
<username>admin</username>
<password>123456</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>123456</password>
</server>
<server>
<id>releases</id>
<username>admin</username>
<password>123456</password>
</server>
- 为每一个远程私有仓库配置认证信息
admin
是上面部署 Nexus 的默认用户,其实是可以根据每个仓库分别可以拥有哪些操作的多个维度来创建角色和用户信息的
3.4 配置项目工程的 pom.xml
3.4.1 repository 仓库
<!-- 私有仓库 -->
<repositories>
<repository>
<id>nexus3</id>
<url>http://10.211.55.25:18081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
- 配置远程仓库地址
- 这里为局部配置,也就是专门为当前工程配置的远程仓库地址
- 优先级大于
settings -> mirrors
3.4.2 distributionManagement 部署
<!-- 部署到远程私有仓库 -->
<distributionManagement>
<!-- 正式版本 -->
<repository>
<id>releases</id>
<name>releases</name>
<url>http://10.211.55.25:18081/repository/maven-releases/</url>
</repository>
<!-- 测试版本 -->
<snapshotRepository>
<id>snapshots</id>
<name>snapshots</name>
<url>http://10.211.55.25:18081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
- 分别为两个远程仓库配置部署构建
- 其中
id
节点的值必须与### 3.3.2 server 用户名密码
中的id
对应
3.5 使用脚本简化部署操作
3.5.1 .sh
#!/bin/bash
## $() - 方法,${} - 变量
## 开始
echo [INFO] ----------------------------- start --------------------------------------
## 获取入参,应用名称
application_name=$1
## 输出看一眼
echo application_name: ${application_name}
## 参数校验
if [ "$application_name" == "registry" ]||[ "$application_name" == "gateway" ]||[ "$application_name" == "turbine" ]||[ "$application_name" == "sleuth" ]||[ "$application_name" == "base" ]||[ "$application_name" == "log" ]||[ "$application_name" == "all" ];
then
## 参数判断
if [ "$application_name" != "all" ];
then
## 入口
echo [INFO] ------------------------ 进入单个服务部署 ---------------------------------
## 1. 安装所有服务
## commons
cd osc-commons/
mvn clean install -Dmaven.test.skip=true
mvn clean deploy -Dmaven.test.skip=true
## service
cd ../osc-service/
mvn clean install -Dmaven.test.skip=true
if [ "$application_name" == "base" ]||[ "$application_name" == "log" ];
then
## 2. 安装部署指定服务
cd osc-$application_name-service/osc-$application_name-service-api/
mvn clean deploy -Dmaven.test.skip=true
cd ../osc-$application_name-service-core/
mvn clean deploy -Dmaven.test.skip=true
## 3. 返回根目录
cd ../../../
else
## 2. 安装部署指定服务
cd osc-$application_name-service/
mvn clean deploy -Dmaven.test.skip=true
## 3. 返回根目录
cd ../../
fi
## 结束
echo [INFO] ----------------------------- end --------------------------------------
echo [INFO] ------------------------------------------------------------------------
else
## 入口
echo [INFO] ------------------------ 进入整个服务部署 ---------------------------------
## 1. 安装所有服务
## commons
cd osc-commons/
mvn clean install -Dmaven.test.skip=true
mvn clean deploy -Dmaven.test.skip=true
## service
cd ../osc-service/
mvn clean install -Dmaven.test.skip=true
## 2. 挨个安装部署服务
## 注册中心
cd osc-registry-service/
mvn clean deploy -Dmaven.test.skip=true
## 网关
cd ../osc-gateway-service/
mvn clean deploy -Dmaven.test.skip=true
## 断路器聚合监控中心
cd ../osc-turbine-service/
mvn clean deploy -Dmaven.test.skip=true
## 链路跟踪监控中心
cd ../osc-sleuth-service/
mvn clean deploy -Dmaven.test.skip=true
## 基础工程
cd ../osc-base-service/osc-base-service-api/
mvn clean deploy -Dmaven.test.skip=true
cd ../osc-base-service-core/
mvn clean deploy -Dmaven.test.skip=true
## 日志工程
cd ../../osc-log-service/osc-log-service-api/
mvn clean deploy -Dmaven.test.skip=true
cd ../osc-log-service-core/
mvn clean deploy -Dmaven.test.skip=true
## 3. 返回根目录
cd ../../../
## 结束
echo [INFO] -------------------------- end -------------------------------------
echo [INFO] ------------------------------------------------------------------------
fi
else
## 入口
echo [INFO] ------------------------ 参数不正确 ---------------------------------
## 结束
echo [INFO] -------------------------- end -------------------------------------
echo [INFO] ------------------------------------------------------------------------
fi
非常简单的一个脚本文件:判断是否入参了应用名称,如果有,就进行安装部署操作
如何使用:
- 点击
IDEA
底部的Terminal
终端入口 - 进入到项目根目录
MacBook-Pro:osc-api zouwencong$ pwd
/Users/zouwencong/JavaWork/my_osc/osc-api
MacBook-Pro:osc-api zouwencong$ ls -all
total 64
drwxr-xr-x 13 zouwencong staff 416 Jun 5 21:50 .
drwxr-xr-x 7 zouwencong staff 224 Jun 6 16:22 ..
-rw-r--r--@ 1 zouwencong staff 8196 Jun 5 21:50 .DS_Store
drwxr-xr-x 15 zouwencong staff 480 Jun 5 22:21 .git
-rw-r--r--@ 1 zouwencong staff 428 Jun 13 18:47 .gitignore
drwxr-xr-x 7 zouwencong staff 224 Jun 16 08:58 .idea
-rw-r--r--@ 1 zouwencong staff 33 Jun 13 18:47 README.md
-rw-r--r--@ 1 zouwencong staff 5476 Jun 13 18:47 deploy.bat
-rwxr-xr-x@ 1 zouwencong staff 3744 Jun 13 18:47 deploy.sh
-rw-r--r--@ 1 zouwencong staff 1622 Jun 13 18:47 growth-version.bat
-rwxr-xr-x@ 1 zouwencong staff 1649 Jun 13 18:47 growth-version.sh
-rw-r--r--@ 1 zouwencong staff 122 Jun 13 18:47 old-version.bat
drwxr-xr-x@ 4 zouwencong staff 128 Jun 13 18:47 osc-commons
drwxr-xr-x@ 9 zouwencong staff 288 Jun 13 18:47 osc-service
MacBook-Pro:osc-api zouwencong$
- 输入命令
./deploy.sh all
:这时会把所有的工程都项目编译、单元测试、打包功能、安装部署到本地仓库、安装部署到远程仓库 - 如果只想单独部署指定的服务,那么命令就是
./deploy.sh registry
:部署注册中心服务工程
------------------- 2020.06.13 更新:归类脚本文件 -------------------
- 目录现在变成了这样
MacBook-Pro:osc-api zouwencong$ ls -all
total 40
drwxr-xr-x 11 zouwencong staff 352 Jun 13 22:27 .
drwxr-xr-x 7 zouwencong staff 224 Jun 6 16:22 ..
-rw-r--r--@ 1 zouwencong staff 10244 Jun 13 23:03 .DS_Store
drwxr-xr-x 15 zouwencong staff 480 Jun 13 23:01 .git
-rw-r--r-- 1 zouwencong staff 428 Jun 4 11:47 .gitignore
drwxr-xr-x 11 zouwencong staff 352 Jun 13 23:07 .idea
-rw-r--r--@ 1 zouwencong staff 33 Nov 15 2019 README.md
drwxr-xr-x 4 zouwencong staff 128 Jan 10 11:28 logs
drwxr-xr-x 10 zouwencong staff 320 Jun 13 18:34 osc-commons
drwxr-xr-x 14 zouwencong staff 448 Jun 11 09:27 osc-service
drwxr-xr-x 5 zouwencong staff 160 Jun 13 22:27 script
MacBook-Pro:osc-api zouwencong$
- 脚本文件都放在了
script
目录下,这时的命令就更改为./script/deploy/deploy.sh all
核心命令:
mvn clean install -Dmaven.test.skip=true
:执行此命令会先清理target
目录,再进行项目编译、单元测试、打包功能、安装部署到本地仓库;加上-Dmaven.test.skip=true
参数则会跳过测试mvn clean deploy -Dmaven.test.skip=true
:执行此命令会先清理target
目录,再进行项目编译、单元测试、打包功能、安装部署到本地仓库、安装部署到远程仓库;加上-Dmaven.test.skip=true
参数则会跳过测试
3.5.2 .bat
@echo off
REM ## 开始
echo [INFO] ----------------------------- start --------------------------------------
REM ## 获取入参,应用名称
set application_name=%1%
REM ## 输出看一眼
echo application_name: %application_name%
REM ## 参数是否符合
REM set "is_true=false"
REM ## 输出看一眼
REM echo is_true: %is_true%
REM ## 参数校验
if "%application_name%" == "all" (
REM ## 入口
echo [INFO] ------------------------ 进入整个服务部署 ---------------------------------
REM ## 1. 安装所有服务
REM ## commons
cd osc-commons/
mvn clean install -Dmaven.test.skip=true
mvn clean deploy -Dmaven.test.skip=true
REM ## service
cd ../osc-service/
mvn clean install -Dmaven.test.skip=true
REM ## 2. 挨个安装部署服务
REM ## 注册中心
cd osc-registry-service/
mvn clean deploy -Dmaven.test.skip=true
REM ## 网关
cd ../osc-gateway-service/
mvn clean deploy -Dmaven.test.skip=true
REM ## 断路器聚合监控中心
cd ../osc-turbine-service/
mvn clean deploy -Dmaven.test.skip=true
REM ## 链路跟踪监控中心
cd ../osc-sleuth-service/
mvn clean deploy -Dmaven.test.skip=true
REM ## 基础工程
cd ../osc-base-service/osc-base-service-api/
mvn clean deploy -Dmaven.test.skip=true
cd ../osc-base-service-core/
mvn clean deploy -Dmaven.test.skip=true
REM ## 日志工程
cd ../../osc-log-service/osc-log-service-api/
mvn clean deploy -Dmaven.test.skip=true
cd ../osc-log-service-core/
mvn clean deploy -Dmaven.test.skip=true
REM ## 3. 返回根目录
cd ../../../
REM ## 结束
echo [INFO] -------------------------- end -------------------------------------
echo [INFO] ------------------------------------------------------------------------
) else (
REM ## 入口
echo [INFO] ------------------------ 进入单个服务部署 ---------------------------------
REM ## 1. 安装所有服务
REM ## commons
cd osc-commons/
mvn clean install -Dmaven.test.skip=true
mvn clean deploy -Dmaven.test.skip=true
REM ## service
cd ../osc-service/
mvn clean install -Dmaven.test.skip=true
REM ## 参数校验
if "%application_name%" == "registry" (
REM ## 2. 安装部署指定服务
cd osc-%application_name%-service/
mvn clean deploy -Dmaven.test.skip=true
REM ## 3. 返回根目录
cd ../../
) else (
if "%application_name%" == "gateway" (
REM ## 2. 安装部署指定服务
cd osc-%application_name%-service/
mvn clean deploy -Dmaven.test.skip=true
REM ## 3. 返回根目录
cd ../../
) else (
if "%application_name%" == "turbine" (
REM ## 2. 安装部署指定服务
cd osc-%application_name%-service/
mvn clean deploy -Dmaven.test.skip=true
REM ## 3. 返回根目录
cd ../../
) else (
if "%application_name%" == "sleuth" (
REM ## 2. 安装部署指定服务
cd osc-%application_name%-service/
mvn clean deploy -Dmaven.test.skip=true
REM ## 3. 返回根目录
cd ../../
) else (
if "%application_name%" == "base" (
REM ## 2. 安装部署指定服务
cd osc-%application_name%-service/osc-%application_name%-service-api/
mvn clean deploy -Dmaven.test.skip=true
cd ../osc-%application_name%-service-core/
mvn clean deploy -Dmaven.test.skip=true
REM ## 3. 返回根目录
cd ../../../
) else (
if "%application_name%" == "log" (
REM ## 2. 安装部署指定服务
cd osc-%application_name%-service/osc-%application_name%-service-api/
mvn clean deploy -Dmaven.test.skip=true
cd ../osc-%application_name%-service-core/
mvn clean deploy -Dmaven.test.skip=true
REM ## 3. 返回根目录
cd ../../../
) else (
REM ## 返回根目录
cd ../
REM ## 入口
echo [INFO] ------------------------ 参数不正确 ---------------------------------
REM ## 结束
echo [INFO] -------------------------- end -------------------------------------
echo [INFO] ------------------------------------------------------------------------
)
)
)
)
)
)
)
与.sh
所要达到的效果与目的一致,所以就简单说明一下存在差异的地方:
有哪些差异:
- 语法上的差异
- 执行方式的差异,
.bat
批处理脚本执行命令:deploy.bat all
------------------- 2020.06.13 更新:归类脚本文件 -------------------
.bat
批处理脚本执行命令更改为:script\deploy\deploy.bat all
4. 验证
4.1 接口
- 下载
v1.4.4
标签的代码或者对照本篇博客更改v1.4.3
标签的代码 - 如果是
macOS
系统,则还需要设置.sh
脚本文件的可执行权限:chmod +x deploy.sh
- 点击
IDEA
底部的Terminal
终端入口 - 进入到项目根目录
- 根据不同系统,使用不同命令:
./script/deploy/deploy.sh all
或script\deploy\deploy.bat all
5. 结语
把重复的操作编写到脚本里,提高效率节约时间,巴适。
希望能够帮助到你
over