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不存在的模块会报错.
相关推荐
2301_796512526 小时前
Rust编程学习 - 如何利用代数类型系统做错误处理的另外一大好处是可组合性(composability)
java·学习·rust
清水6 小时前
Spring Boot企业级开发入门
java·spring boot·后端
一个不称职的程序猿6 小时前
高并发场景下的缓存利器
java·缓存
2301_801252227 小时前
Tomcat的基本使用作用
java·tomcat
lkbhua莱克瓦247 小时前
Java基础——常用算法3
java·数据结构·笔记·算法·github·排序算法·学习方法
麦麦鸡腿堡7 小时前
Java_TreeSet与TreeMap源码解读
java·开发语言
moringlightyn7 小时前
进度条+ 基础开发工具----版本控制器git 调试器gdb/cgdb
笔记·git·其他·c·调试器·gdb/cgdb·进度条 倒计时
教练、我想打篮球7 小时前
05 kafka 如何存储较大数据记录
java·kafka·record
uesowys7 小时前
华为OD算法开发指导-简易内存池
java·算法·华为od
gladiator+7 小时前
Java中的设计模式------策略设计模式
java·开发语言·设计模式