Jpom Jpom
🔖首页
  • 一键安装教程
  • Docker 容器安装教程
  • 离线安装教程
  • v2.9.X迁移到v2.10.X指南
  • v2.8.X迁移到v2.9.X指南
  • 数据库迁移到 mysql
  • 实践案例目录
  • 名词解释
  • 什么是 DSL
  • 权限说明
💡DSL说明
  • 加入社区讨论
  • 如何贡献
  • 贡献者们
🤝用户
  • 下载中心
  • Gitee (opens new window)
  • Github (opens new window)
🔖首页
  • 一键安装教程
  • Docker 容器安装教程
  • 离线安装教程
  • v2.9.X迁移到v2.10.X指南
  • v2.8.X迁移到v2.9.X指南
  • 数据库迁移到 mysql
  • 实践案例目录
  • 名词解释
  • 什么是 DSL
  • 权限说明
💡DSL说明
  • 加入社区讨论
  • 如何贡献
  • 贡献者们
🤝用户
  • 下载中心
  • Gitee (opens new window)
  • Github (opens new window)
❤️成为赞助商
  • 解决方案

    • 如何使用 Jpom 的在线构建为 Jpom 发版
      • 前言
        • 手动版
        • 自动版
        • 核心流程总结
        • 需要使用到的相关功能
      • 创建相关的构建
        • 发布安装包的构建
        • 发布事件脚本
        • 发布文档的构建
        • 发布 docker 镜像构建
        • 注意
      • 触发构建
      • 总结
      • 附件
        • 快速替换版本号脚本
        • 构建容器 dockerfile
    • 万能的 DSL 项目模板(Java)
    • 基于 Jpom 搭建应用部署系统
    • 一键安装实践
    • Docker 容器安装实践
    • 离线安装实践
    • 自定义第三方通知
  • 在线构建

    • 本地构建 + SSH 发布 java 项目
    • 本地构建 + Jpom Server 使用 SCP 发布项目
    • 本地构建 + 项目发布 node 项目
    • 本地构建 + SSH 发布 node 项目
    • 本地构建 + 自定义管理 python 项目
    • 容器构建 + 项目发布 java 项目
    • Gitee 提交代码后自动执行构建
    • 使用 gradle 本地构建打包项目并发布到节点
    • GitLab 提交代码后自动执行构建
    • 通过私人令牌导入仓库
  • docker

    • 管理 docker
    • 在线构建 docker 镜像
    • 在线构建 docker 镜像并推送至远程仓库
    • docker 安装 redis 流程
  • 节点管理

    • 管理编译安装的 nginx
  • 项目管理

    • 自定义管理 java 项目
    • DSL项目接口探活
    • 在 Jpom 中如何使用 DSL 项目来管理 TOMCAT
    • 在 Jpom 中如何使用 DSL 项目来管理 elasticsearch
  • 项目监控

    • 监控项目 + 邮件报警通知
    • DSL 项目接口探活监控报警
  • 在线脚本

    • 使用节点脚本定时备份 docker 中的 mysql 数据库
  • SSH管理

    • 在线管理 SSH 终端以及上传文件(SFTP)和执行命令历史
  • 日常管理

    • 如何开启 h2-console web 访问功能
  • 实践案例
  • 解决方案
bwcx_jzy
2023-02-24
目录

如何使用 Jpom 的在线构建为 Jpom 发版

# 前言

Jpom 中有在线构建,那么可以使用 Jpom 本身相关的功能实现 Jpom 每次的版本发版吗?

当然可以的!!

声明

本文档想要建立在您对 Jpom 已经有一定的熟悉度后的高阶操作。 里面涉及到一些基础功能的使用。 如果您还是新手入门 Jpom ,还想要您看看其他相关文档或者上手操作后再来看看本文档来找解决方案灵感

本文默认您已经会使用 Jpom 的基础功能了,不再讲解如果安装 Jpom,如果有不会的可以参考其他文档

注意:本文采用基于 2.10.21 版本讲解,系统为 centos

我们先梳理一下 Jpom 发版的流程:

# 手动版

手动版是指,未使用 Jpom 来实现发版的流程

  1. 将 dev 分支合并到 master
  2. changelog 版本增加发版日期
  3. 更新代码版本号:cd ./jpom-parent/script && sh replaceVersion.sh 2.x.x
  4. 打包前端:npm i && npm run build
  5. 打包后端:mvn clean package
  6. 人工测试服务端包和插件端包是否可以正常启动
  7. 提交一个 commit 2.x.x
  8. 基于 commit 新增 tag: v2.x.x 并且将代码推送到远程
  9. 将包上传到 oss : sh deploy-release-oss.sh
  10. 更新文档版本号:cd ./docs/script && sh replaceVersion.sh 2.x.x
  11. 手动 copy 更新文档 changelog
  12. 发布文档:sh deploy-docs-pages.sh
  13. 测试远程更新是否正常
  14. 发布服务端 docker 镜像包 docker buildx build --platform linux/amd64,linux/arm64 -t jpomdocker/jpom:2.x.x -t jpomdocker/jpom:latest -f ./modules/server/DockerfileRelease --push .
  15. 添加 gitee、github 发行版
  16. 可选填写发版公告

# 自动版

自动版是指使用 Jpom 里面的构建功能来实现发版流程,减少人为操作

  1. 将 dev 分支合并到 master
  2. 人工打包并测试相关功能
  3. changelog 版本增加发版日期
  4. 执行-发布代码任务 (注意修改构建命令版本号)
  5. 基于 commit 新增 tag: v2.x.x 并且将代码推送到远程
  6. 手动 copy 更新文档 changelog
  7. 执行-发布文档 (注意修改构建命令版本号)
  8. 测试远程更新是否正常
  9. 执行-发布镜像
  10. 添加 gitee、github 发行版
  11. 可选填写发版公告

# 核心流程总结

  1. 需要快速更改 pom.xml 版本号
  2. 需要前构建前端 vue
  3. 前端构建完成后再构建后端 java
  4. 需要将构建完成的文件包上传到远程存储中
  5. 发布文档来实现更新新版本的信息(实现客户端知道有新版本)
  6. 为服务端发布 docker 镜像,并推送到 docker hub 远程仓库

# 需要使用到的相关功能

  1. 仓库管理
  2. 在线构建
    1. 构建发布本地命令
    2. 构建的事件脚本
    3. 附件环境变量
  3. 服务端脚本

# 创建相关的构建

这里我们为了保留整个流程能分开控制和为了检查发版过程中的正确性,分开创建三个构建来实现。

  1. 发布安装包
  2. 发布文档
  3. 发布 docker 镜像

# 发布安装包的构建

构建的配置截图

img.png

事件脚本里配置截图

img_1.png

注意

我这里事件脚本中只实现了: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 

1
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
1
2
3
4
5

# 发布事件脚本

这里注意,发布事件脚本中,要想获取构建相关的文件只能通过环境变量来实现:

  1. $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

1
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

# 发布文档的构建

img_2.png

构建命令:


  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

1
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 发布 docker 镜像构建

img_3.png

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 .
1
2

附件环境变量:

是指读取仓库文件下的指定文件,并解析为环境变量

img_4.png

这里的变量值,已经在发布安装包的时候,自动替换更为新版本啦

# 注意

在 linux 下使用 docker buildx 想要提前安装的奥,docker buildx 安装方式在不同内核版本有一定差异

送您一个避坑文档:https://blog.bwcxtech.com/posts/43dd6afb/ (opens new window)

# 触发构建

Jpom 发版都是手动触发,并且每个版本的版本号不一样,相当于每次构建都想要修改版本号

构建安装包

img_5.png

这里在每次触发构建时候修改环境变量的值为最新版本,并且替换版本号脚本里面也有验证重复构建

构建文档

img_6.png

# 总结

整体流程是:

  1. 使用构建调用替换版本号脚本来实现批量修改 pom.xml、相关文件的版本号
    1. 替换版本号的参数由构建参数传递进来
  2. 使用 git 将替换版本号后的代码提交到远程
  3. 构建前端 + 后端
  4. 使用事件脚本执行文件上传、验证文件完整性
  5. 使用构建发布文档(思路流程和发布安装包一致)
  6. 使用 docker buildx 实现构建多内核镜像
    1. 使用构建附加环境变量来实现 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"

1
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"]
1
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
帮助我们改善此文档 (opens new window)
上次更新: 2023/03/24, 15:52:45
万能的 DSL 项目模板(Java)

万能的 DSL 项目模板(Java)→

最近更新
01
2023年
03-31
02
2022年
03-31
03
2021年
03-31
更多文章>
Theme by Vdoing | Copyright © 2017-2023 MIT License  京ICP备17044819号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×