一、源起
目前核心系统各个模块开发,测试,uat环境都采用jenkins自动全量发版,UAT环境测试通过符合生产发版要求时,通知各模块负责人打生产增量包,
负责人从UAT分支拉取增量代码打成增量包,完全依赖个人。
二、设计思路
前提: 各个模块最新代码,在jenkins服务器上workspace中都有
涉及的工具:jenkins pipeline(安装插件“Extended Choice Parameter plugin”),shell脚本
2.1. 取SVN代码变化日志
执行SVN diff 命令抓取指定一段时间内,指定模块指定环境下代码变化日志----输出到patch.txt
svn diff -r{$BEGIN_DATE}:{$END_DATE} $CODEPATH --summarize --no-auth-cache >./patch.txt
2.2 获取源文件清单(文件路径)
svn全路径替换为相对项目的文件路径
2.3. 获取目标文件清单(文件路径)
根据pathch.txt,生成class文件清单patch_class.txt
2.3.1 编译路径替换
2.3.2 追加匿名内部类-----patch_class.txt
2.4. 生成JAR增量包
进入待打包模块的jenkins job路径下,
2.5. 人工确认通过后,增量包提交svn
三、实现
安装插件“Extended Choice Parameter plugin”,如果再jenkins的可安装插件中找不到这个插件,就去http://updates.jenkins-ci.org/download/plugins/ 这里找
用到三个构建参数:开始时间(输入框),结束时间(输入框),模块(多选框)
pipeline Script
node {
def mvnMap= ['mvnHome': '/data/jenkins/apache-maven', 'mvnRemovePrefix': 'svn/target']
def antMap= ['antHome': 'data/jenkins/apache-ant', 'antRemovePrefix': 'svn/build']
def proMap= ['server': '', 'report': 'test_report', 'job': 'test_job'] //定义项目字典
def publisherMap = ['execCommand': '/data/.jenkins/pak/prePack.sh', 'submitCommand': '/data/.jenkins/pak/submitPack.sh', 'execTimeout': '120000', 'sourceFiles': ''] //定义发布脚本
def dingMap = ['accessToken': 'a9c9e4be299a52f5a9af1e7e5a1280ecd436bc2a16a409cb84a5b2f687362c6c', 'jenkinsUrl': 'http://10.15.22.14:8080/jenkins/']
try {
stage('增量代码获取') { //for display purposes//Get some code from a SubversionSCM repository
def moduleList = MODULE.split(",")echo "moduleList length: ${moduleList.length}"
for (int i = 0; i < moduleList.length ; i++) {sh label: '',
script:"sh ${publisherMap.execCommand} ${开始时间} ${结束时间} ${moduleList[i]}"}
}
stage('JAR包提交SVN') { //for display purposes
input '是否提交SVN'
sh label: '',
script:"sh ${publisherMap.submitCommand}"}
} finally {if (currentBuild.result == 'SUCCESS') {
dingTalk accessToken:"${dingMap.accessToken}",
imageUrl:'',
jenkinsUrl:"${dingMap.jenkinsUrl}",
message:'构建成功',
notifyPeople:''}else if (currentBuild.result == 'FAILURE') {
dingTalk accessToken:"${dingMap.accessToken}",
imageUrl:'',
jenkinsUrl:"${dingMap.jenkinsUrl}",
message:'构建失败',
notifyPeople:''}else{echo "currentBuild ......"}
}
}
后续扩展,目前增量源文件,目标文件都有保存下来,后续如需要实现生成增量代码覆盖率报告,更方便