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不存在的模块会报错.
相关推荐
llwszx1 小时前
深入理解Java锁原理(一):偏向锁的设计原理与性能优化
java·spring··偏向锁
云泽野2 小时前
【Java|集合类】list遍历的6种方式
java·python·list
二进制person2 小时前
Java SE--方法的使用
java·开发语言·算法
小阳拱白菜3 小时前
java异常学习
java
FrankYoou4 小时前
Jenkins 与 GitLab CI/CD 的核心对比
java·docker
麦兜*5 小时前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
KK溜了溜了5 小时前
JAVA-springboot 整合Redis
java·spring boot·redis
天河归来5 小时前
使用idea创建springboot单体项目
java·spring boot·intellij-idea
星源~5 小时前
tree 命令集成到 Git Bash:可视化目录结构的指南
git·单片机·物联网·嵌入式·项目开发
weixin_478689765 小时前
十大排序算法汇总
java·算法·排序算法