Git+Maven+Jenkins的增量发布

项目结构大致如下:

shell 复制代码
platform-server
├─doc
├─platform-base
├─platform-bom-dependencies
├─platform-commons
│  ├─platform-commons-core
│  ├─platform-commons-dubbo
│  ├─platform-commons-geo
│  ├─platform-commons-lang
│  ├─platform-commons-locker-default
│  ├─platform-commons-locker-redis
│  ├─platform-commons-messaging-rabbitmq
│  ├─platform-commons-proto
│  ├─platform-commons-swagger
│  └─platform-commons-web
├─platform-coupon
│  ├─platfrom-coupon-api
│  ├─platfrom-coupon-core
│  ├─platfrom-coupon-web
├─platform-order
│  ├─platfrom-order-api
│  ├─platfrom-order-core
│  ├─platfrom-order-web
├─platform-starter
│  └─platform-starter-chu-admin
│  └─platform-starter-chu-app
├─platform-system
│  ├─platform-system-api
│  ├─platform-system-core
│  └─platform-system-web
│─platfrom-member
│  ├─platfrom-member-api
│  ├─platfrom-member-core
│  ├─platfrom-member-web
└─......

platform-starter下的是最终制品,打包制品应用时,它的依赖会从maven本地仓库拉取。

开发过程中,修改了若干模块,希望能只重新编译和install有改动的模块,而不是整个项目(因为费时)。

但一个个记忆和发布改动的模块不仅繁琐而且容易遗漏, 所以希望能借助git的文件差异记录以及mvn命令自动完成这一过程.

使用Jenkins环境变量

在构建步骤中的"执行 shell"里新增以下脚本:

shell 复制代码
#!/bin/sh -e

# $GIT_PREVIOUS_COMMIT是Jenkins的环境变量,表示上次构建时的git提交id
# 只筛选platform开头的以排除类似doc这样的非模块改动
# 排除platform-starter,制品模块会单独构建,不参与增量发布
# 处理/src和/pom.xml以兼容一级模块
MODULES=`git diff --name-only $GIT_PREVIOUS_COMMIT|grep '^platform'|grep -v '^platform-starter'|awk -F "/" '{print $1"/"$2}'|sort|uniq|sed 's/\/src//g'|sed 's/\/pom.xml//g'|tr "\n" ","`

if [ "x$MODULES" != "x" ]
then
    echo 'module that be install:'
    echo $MODULES|tr ',' '\n'
    # -pl指定构建模块,多个用逗号隔开;如果多个模块间存在依赖关系,会自动先构建被依赖的模块
    mvn clean install -Dmaven.test.skip=true -pl $MODULES
else
    echo 'nothing to install.'
fi

如果不使用Jenkins, 可以使用分支或文件来记录commitid, 其它是一样的:

shell 复制代码
#!/bin/sh -e

# 这里使用分支来记录上次构建的commitid, 或者也可以把commitid记录到文件里, 需要的时候再读出来
# git rev-parse HEAD>GIT_PREVIOUS_SUCCESSFUL_COMMIT.TXT
if [ "x`git branch -a|grep build`" = "x" ];then
    git branch build
fi

MODULES=`git diff --name-only build|grep '^platform'|grep -v '^platform-starter'|awk -F "/" '{print $1"/"$2}'|sort|uniq|sed 's/\/src//g'|sed 's/\/pom.xml//g'|tr "\n" ","`

if [ "x$MODULES" != "x" ]
then
    echo 'module that be install:'
    echo $MODULES|tr ',' '\n'
    mvn clean install -Dmaven.test.skip=true -pl $MODULES
    git branch -D build
    git branch build 
else
    echo 'nothing to install.'
fi

以下情况无法兼容:

  • 删除模块, mvn install不存在的模块会报错.
相关推荐
AKA__Zas1 小时前
初识 事务
java·开发语言·数据库·sql
kongba0071 小时前
2026年4月19日 kimi记忆备份
java·前端·数据库
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题】【Java基础篇】01_说说ArrayList的底层原理/扩容规则
java·后端·面试·list
高斯林.神犇1 小时前
六、java配置类改造ioc
java·开发语言
zuowei28892 小时前
Spring BOOT 启动参数
java·spring boot·后端
张小洛2 小时前
Spring 常用类深度剖析(工具篇 04):CollectionUtils 与 Stream API 的对比与融合
java·后端·spring·spring工具类·spring utils·spring 类解析
一 乐2 小时前
房产租赁管理|基于springboot + vue房产租赁管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·房产租赁管理系统
xieliyu.2 小时前
Java顺序表实现扑克牌Fisher-Yates 洗牌算法
java·数据结构·算法·javase
YanDDDeat2 小时前
【Spring】事务注解失效与传播机制
java·后端·spring
SamDeepThinking3 小时前
学数据结构到底有什么用
java·后端·面试