项目结构大致如下:
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不存在的模块会报错.