如何使用 Jpom 的在线构建为 Jpom 发版
# 前言
Jpom 中有在线构建,那么可以使用 Jpom 本身相关的功能实现 Jpom 每次的版本发版吗?
当然可以的!!
声明
本文档想要建立在您对 Jpom 已经有一定的熟悉度后的高阶操作。 里面涉及到一些基础功能的使用。 如果您还是新手入门 Jpom ,还想要您看看其他相关文档或者上手操作后再来看看本文档来找解决方案灵感
本文默认您已经会使用 Jpom 的基础功能了,不再讲解如果安装 Jpom,如果有不会的可以参考其他文档
注意:本文采用基于 2.10.21 版本讲解,系统为 centos
我们先梳理一下 Jpom 发版的流程:
# 手动版
手动版是指,未使用 Jpom 来实现发版的流程
- 将 dev 分支合并到 master
- changelog 版本增加发版日期
- 更新代码版本号:
cd ./jpom-parent/script && sh replaceVersion.sh 2.x.x
- 打包前端:
npm i && npm run build
- 打包后端:
mvn clean package
- 人工测试服务端包和插件端包是否可以正常启动
- 提交一个 commit 2.x.x
- 基于 commit 新增 tag: v2.x.x 并且将代码推送到远程
- 将包上传到 oss :
sh deploy-release-oss.sh
- 更新文档版本号:
cd ./docs/script && sh replaceVersion.sh 2.x.x
- 手动 copy 更新文档 changelog
- 发布文档:
sh deploy-docs-pages.sh
- 测试远程更新是否正常
- 发布服务端 docker 镜像包
docker buildx build --platform linux/amd64,linux/arm64 -t jpomdocker/jpom:2.x.x -t jpomdocker/jpom:latest -f ./modules/server/DockerfileRelease --push .
- 添加 gitee、github 发行版
- 可选填写发版公告
# 自动版
自动版是指使用 Jpom 里面的构建功能来实现发版流程,减少人为操作
- 将 dev 分支合并到 master
- 人工打包并测试相关功能
- changelog 版本增加发版日期
- 执行-发布代码任务 (注意修改构建命令版本号)
- 基于 commit 新增 tag: v2.x.x 并且将代码推送到远程
- 手动 copy 更新文档 changelog
- 执行-发布文档 (注意修改构建命令版本号)
- 测试远程更新是否正常
- 执行-发布镜像
- 添加 gitee、github 发行版
- 可选填写发版公告
# 核心流程总结
- 需要快速更改 pom.xml 版本号
- 需要前构建前端 vue
- 前端构建完成后再构建后端 java
- 需要将构建完成的文件包上传到远程存储中
- 发布文档来实现更新新版本的信息(实现客户端知道有新版本)
- 为服务端发布 docker 镜像,并推送到 docker hub 远程仓库
# 需要使用到的相关功能
- 仓库管理
- 在线构建
- 构建发布本地命令
- 构建的事件脚本
- 附件环境变量
- 服务端脚本
# 创建相关的构建
这里我们为了保留整个流程能分开控制和为了检查发版过程中的正确性,分开创建三个构建来实现。
- 发布安装包
- 发布文档
- 发布 docker 镜像
# 发布安装包的构建
构建的配置截图
事件脚本里配置截图
注意
我这里事件脚本中只实现了:release
,您需要跟进您想要实现的对应事件来填写
构建命令:
这里为了实现自动 commit 代码,我在构建服务器中手动安装了 git,并配置了全局凭证
git config --system user.name "bwcx_jzy"
git config --system user.email "bwcx_jzy@163.com"
old_version=$(cat ./docs/version.txt)
mvn -s ./script/settings.xml clean
if [ "$new_version" == "$old_version" ]; then
echo "版本一致不用替换"
exit 1
else
sh ./script/replaceVersion.sh $new_version
git add .
#message="commit $now_version"
git commit -m "commit"\ ${new_version}
git push
fi
cd web-vue && npm i && npm run build
cd ../
mvn -s ./script/settings.xml clean package
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
发布命令:
这里发布命令只是为了随意输出,最终还是通过事件脚本来实现了上传安装包到远程。当然您也可以将对应的脚本配置到发布命令中,跟进自己的情况来决定(随意搭配)
echo ${BUILD_RESULT_FILE}
cat ${BUILD_RESULT_FILE}/modules/server/target/checksums.csv
cat ${BUILD_RESULT_FILE}/modules/agent/target/checksums.csv
2
3
4
5
# 发布事件脚本
这里注意,发布事件脚本中,要想获取构建相关的文件只能通过环境变量来实现:
- $buildResultFile
更多环境变量,可以参考构建页面的小问号
#!/bin/bash
current_path=$(pwd)
case "$(uname)" in
Linux)
bin_abs_path=$(readlink -f $(dirname "$0"))
;;
*)
bin_abs_path=`cd $(dirname $0) || exit; pwd`
;;
esac
DIR_PATH=$buildResultFile/
now_version="$(cat "${DIR_PATH}/docs/version.txt")"
#
now_version="$(echo $now_version |tr -d '\n\r')"
echo "当前路径:${current_path} 脚本路径:${bin_abs_path},目录:${DIR_PATH} 当前版本:${now_version}"
if [ ! -n "$now_version" ]; then
echo "ERROR: 版本不存在,请确认 /docs/version.txt 中信息正确"
exit
fi
OS="$(uname)"
case "${OS}" in
Linux)
ossUtil='ossutil64'
;;
Darwin)
ossUtil='ossutilmac64'
;;
*)
echo "Unsupported os: ${OS}"
exit 1
;;
esac
echo "${OS} ${ossUtil} 开始上传"
echo "同步到 agent oss 中"
# 同步到 agent oss 中
${ossUtil} cp ${DIR_PATH}/modules/agent/target/agent-${now_version}-release.tar.gz oss://jpom-releases/release/${now_version}/ -f
${ossUtil} cp ${DIR_PATH}/modules/agent/target/agent-${now_version}-release.tar.gz.sha1 oss://jpom-releases/release/${now_version}/ -f
${ossUtil} cp ${DIR_PATH}/modules/agent/target/agent-${now_version}-release.zip oss://jpom-releases/release/${now_version}/ -f
${ossUtil} cp ${DIR_PATH}/modules/agent/target/agent-${now_version}-release.zip.sha1 oss://jpom-releases/release/${now_version}/ -f
echo "同步到 server oss 中"
# 同步到 server oss 中
${ossUtil} cp ${DIR_PATH}/modules/server/target/server-${now_version}-release.tar.gz oss://jpom-releases/release/${now_version}/ -f
${ossUtil} cp ${DIR_PATH}/modules/server/target/server-${now_version}-release.tar.gz.sha1 oss://jpom-releases/release/${now_version}/ -f
${ossUtil} cp ${DIR_PATH}/modules/server/target/server-${now_version}-release.zip oss://jpom-releases/release/${now_version}/ -f
${ossUtil} cp ${DIR_PATH}/modules/server/target/server-${now_version}-release.zip.sha1 oss://jpom-releases/release/${now_version}/ -f
rm -f ${DIR_PATH}/jpom-${now_version}.zip
zip -rj ${DIR_PATH}/jpom-${now_version}.zip ${DIR_PATH}/modules/server/target/server-${now_version}-release.zip ${DIR_PATH}/modules/agent/target/agent-${now_version}-release.zip
echo "完整的压缩包"
# 完整的压缩包
${ossUtil} cp ${DIR_PATH}/jpom-${now_version}.zip oss://jpom-releases/release/${now_version}/ -f
rm -f ${DIR_PATH}/jpom-${now_version}.zip
echo "上传结束"
echo "验证 sha1sum"
bash ${DIR_PATH}/script/release-sha1sum.sh
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# 发布文档的构建
构建命令:
git config --system user.name "bwcx_jzy"
git config --system user.email "bwcx_jzy@163.com"
old_version=$(cat ./docs/.vuepress/public/docs/versions.release.tag)
if [ "$new_version" == "$old_version" ]; then
echo "版本一致不用替换"
exit 1
else
sh ./script/replaceVersion.sh $new_version
git add .
#message="commit $now_version"
git commit -m "commit"\ ${new_version}\ "update"\ "docs"\ "pages"
git push
fi
npm i && npm run build
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
发布命令:
echo ${BUILD_RESULT_FILE}
OS="$(uname)"
case "${OS}" in
Linux)
ossUtil='ossutil64'
;;
Darwin)
ossUtil='ossutilmac64'
;;
*)
echo "Unsupported os: ${OS}"
exit 1
;;
esac
# 同步到 oss 中
${ossUtil} sync ${BUILD_RESULT_FILE} oss://jpom-docs/ --delete -f --exclude .DS_Store
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 发布 docker 镜像构建
Jpom 的发布 docker 镜像为基于已经发布的安装去生成的镜像,随意这里就简单很多了
构建命令就随意填写的
发布命令
echo $JPOM_VERSION
docker buildx build --platform linux/amd64,linux/arm64 -t jpomdocker/jpom:$JPOM_VERSION -t jpomdocker/jpom:latest -f ./modules/server/DockerfileRelease --push .
2
附件环境变量:
是指读取仓库文件下的指定文件,并解析为环境变量
这里的变量值,已经在发布安装包的时候,自动替换更为新版本啦
# 注意
在 linux 下使用 docker buildx 想要提前安装的奥,docker buildx 安装方式在不同内核版本有一定差异
送您一个避坑文档:https://blog.bwcxtech.com/posts/43dd6afb/ (opens new window)
# 触发构建
Jpom 发版都是手动触发,并且每个版本的版本号不一样,相当于每次构建都想要修改版本号
构建安装包
这里在每次触发构建时候修改环境变量的值为最新版本,并且替换版本号脚本里面也有验证重复构建
构建文档
# 总结
整体流程是:
- 使用构建调用替换版本号脚本来实现批量修改 pom.xml、相关文件的版本号
- 替换版本号的参数由
构建参数
传递进来
- 替换版本号的参数由
- 使用 git 将替换版本号后的代码提交到远程
- 构建前端 + 后端
- 使用事件脚本执行文件上传、验证文件完整性
- 使用构建发布文档(思路流程和发布安装包一致)
- 使用
docker buildx
实现构建多内核镜像- 使用构建
附加环境变量
来实现 dokcer 命令读取变量,来实现自动更新版本号
- 使用构建
# 附件
# 快速替换版本号脚本
#!/bin/bash
#-----------------------------------------------------------
# 此脚本用于每次升级时替换相应位置的版本号
#-----------------------------------------------------------
set -o errexit
current_path=$(pwd)
case "$(uname)" in
Linux)
bin_abs_path=$(readlink -f $(dirname $0))
;;
*)
bin_abs_path=$(
cd $(dirname $0)
pwd
)
;;
esac
base=${bin_abs_path}/../
echo "当前路径:${current_path} 脚本路径:${bin_abs_path}"
if [ -n "$1" ]; then
new_version="$1"
old_version=$(cat ${base}/docs/version.txt)
echo "$old_version 替换为新版本 $new_version"
else
# 参数错误,退出
echo "ERROR: 请指定新版本!"
exit
fi
if [ ! -n "$old_version" ]; then
echo "ERROR: 旧版本不存在,请确认 /docs/version.txt 中信息正确"
exit
fi
# 替换所有模块pom.xml中的版本
cd ${base} && mvn versions:set -DnewVersion=$1
echo "替换配置文件版本号 $new_version"
if [ -f "$base/.env" ]; then
# 替换 docker 中的版本
sed -i.bak "s/${old_version}/${new_version}/g" $base/.env
fi
# 替换 Dockerfile 中的版本
sed -i.bak "s/${old_version}/${new_version}/g" $base/modules/server/Dockerfile
sed -i.bak "s/${old_version}/${new_version}/g" $base/modules/agent/Dockerfile
sed -i.bak "s/${old_version}/${new_version}/g" $base/script/docker.sh
sed -i.bak "s/${old_version}/${new_version}/g" $base/modules/server/DockerfileRelease
# logo
sed -i.bak "s/${old_version}/${new_version}/g" $base/modules/common/src/main/resources/banner.txt
# vue version
sed -i.bak "s/${old_version}/${new_version}/g" $base/web-vue/package.json
# release-sha1sum.sh
sed -i.bak "s/${old_version}/${new_version}/g" $base/script/release-sha1sum.sh
# gitee go
sed -i.bak "s/${old_version}/${new_version}/g" $base/.workflow/MasterPipeline.yml
# 保留新版本号
echo "$new_version" >$base/docs/version.txt
echo "版本号替换成功 $new_version"
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# 构建容器 dockerfile
FROM maven:3.8.6-jdk-8
ARG BUILD_DATE
LABEL build_info="dromara/Jpom build-date:- ${BUILD_DATE}"
LABEL maintainer="bwcx-jzy <bwcx_jzy@163.com>"
LABEL documentation="https://jpom.top"
ENV JPOM_HOME /usr/local/jpom-server
ENV JPOM_PKG_VERSION 2.10.22
ENV JPOM_PKG server-${JPOM_PKG_VERSION}-release.tar.gz
ENV SHA1_NAME server-${JPOM_PKG_VERSION}-release.tar.gz.sha1
ENV JPOM_DATA_PATH ${JPOM_HOME}/data
ENV JPOM_LOG_PATH ${JPOM_HOME}/logs
# 数据目录
ENV jpom.path ${JPOM_DATA_PATH}
WORKDIR ${JPOM_HOME}
# 时区
ENV TZ Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone
RUN mkdir -p ${JPOM_HOME}
#
RUN curl -LfSo ${JPOM_HOME}/${JPOM_PKG} https://download.jpom.top/release/${JPOM_PKG_VERSION}/${JPOM_PKG}
RUN curl -LfsSo ${JPOM_HOME}/${SHA1_NAME} https://download.jpom.top/release/${JPOM_PKG_VERSION}/${SHA1_NAME} && \
ESUM=`cat ${JPOM_HOME}/${SHA1_NAME}` && \
echo "${ESUM} ${JPOM_HOME}/${JPOM_PKG}" | sha1sum -c -;
RUN tar -zxvf ${JPOM_HOME}/${JPOM_PKG} -C ${JPOM_HOME}
RUN rm -rf ${JPOM_HOME}/${JPOM_PKG}
# 将配置文件暂存默认目录,避免无法挂载
RUN mv $JPOM_HOME/conf $JPOM_HOME/conf_default
# 健康检查
HEALTHCHECK CMD curl -X POST -f http://localhost:2122/check-system || exit 1
EXPOSE 2122
ENTRYPOINT ["/bin/bash", "./bin/BlockListener.sh"]
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41