一、源起
目前核心系統各個模塊開發,測試,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 ......" } } }
后續擴展,目前增量源文件,目標文件都有保存下來,后續如需要實現生成增量代碼覆蓋率報告,更方便
