最近接到一個新需求,通過 Jenkins 封版合並Git代碼,這樣就不用開發自己每天合並代碼防止出錯
我這里就記錄一下這次的操作,可以設置Jenkins自動合並代碼,這樣每天就不會人工去操作安全省事
需求:
1.選項參數和字符參數我已經配置好
2.構建shell
# 如果版本號為0,提示錯誤,並退出
# 檢測版本號格式通過之后,根據構建時選擇的動作執行封版或合代碼動作
封版步驟 (createBranch)
1. 拉取開發分支最新代碼
2. 刪除本地和遠程的test分支
3. 創建版本分支,比如這次封版是3.27,那就創建3.27.x分支
4. 切換到版本分支,並創建test分支
5. 將版本分支和test分支推送到gitLab
合並代碼需求 (MergeVersion)
1.把封版得到的版本分支合並到test分支
2.輸入版本分支合並到test分支
創建Jenkins job任務
在構建任務里 General 下的 This project is parameterized 添加 Choice Parameter 和 String Parameter
輸入這些變量就可以,是為了運行后面的 shell 腳本
源碼地址
這里輸入需要合並封版的源碼地址和有權限操作這個分支的用戶密碼
我這里是需要 master 分支做為源分支,封版都是根據這個分支來創建,你們可以自行修改源分支
創建定時任務
定時任務是每天自動構建合並和封版你需要操作的分支
我這里創建的定時任務是每天下午 17 點自動構建合並代碼
構建shell腳本
在 Jenkins 上構建里添加 Execute shell
#!/bin/sh set -x echo **********************************Start******************************** date # check version value echo $Version # 檢查版本號,如果版本號為0,提示錯誤,並退出 function checkVersion(){ if [ "${Version}" -eq "0" ];then echo "The current version number value is 0,exit 1" exit 1 fi } checkVersion cd ${WORKSPACE}/master # 獲取最近一次遠程 master 提交的 commit id sha1=`git rev-parse remotes/origin/master^{commit}` # 獲取姓名及郵箱,來配置git提交者信息 name=`git show --pretty=%an $sha1 | awk 'NR==1{print}'` email=`git show --pretty=%ce $sha1 | awk 'NR==1{print}'` echo '################# 當前提交人信息:' echo $name echo $email git config --global user.name $name git config --global user.email $email # 獲取 merge 的源分支前綴 function getOriginPrefix(){ # 獲取分支所屬 info_sha1=`git show $sha1 | grep 'Merge:' | cut -d' ' -f3` info_branch=`git branch -r --contains $info_sha1` # 判斷是否 hotfix 分支 isHotfix=`echo "${info_branch}" | grep 'origin/hotfix'` if [ -n "$isHotfix" ]; then echo 'hotfix' else echo 'release' fi } originBra=$(getOriginPrefix) echo '################# 獲取的源分支前綴為:' $originBra # 獲取最近一次創建的標簽 latestTag=`git for-each-ref --sort=-taggerdate --format "%(tag)" refs/tags | grep $originBra | head -n 1` # 獲取最近標簽的年 latestYear=`echo "${latestTag}" | awk -F_ '{print substr($2,1,4)}'` # 獲取最近標簽的月 latestMonth=`echo "${latestTag}" | awk -F_ '{print substr($2,5,2)}'` # 獲取最近標簽的季度 latestQuarter=`echo "${latestMonth}" | awk '{print int(($0-1)/3)+1}'` # 獲取當年 currentYear=`date +%Y` # 獲取當月 currentMonth=`date +%m` # 獲取當日 currentDay=`date +%Y%m%d` # 獲取當前季度 currentQuarter=`echo $currentMonth | awk '{print int(($0-1)/3)+1}'` # 計算當月版本號 if [ $latestMonth -eq $currentMonth ]; then currentMonthVersion=`echo "${latestTag}" | awk -F_ '{print $3+1}'` else currentMonthVersion='1' fi # 計算當季度版本號 if [ $latestQuarter -eq $currentQuarter ]; then currentQuarterVersion=`echo "${latestTag}" | awk -F_ '{print $4+1}'` else currentQuarterVersion='1' fi # 計算當年版本號 if [ $latestYear -eq $currentYear ]; then currentVersion=`echo "${latestTag}" | awk -F_ '{print $5+1}'` else currentVersion='1' fi # 獲取最終標簽名 newVersion=$originBra'_'$currentDay'_'$currentMonthVersion'_'$currentQuarterVersion'_'$currentVersion # 創建標簽 git tag -a $newVersion -m '提交人: '$name git push origin --tags newTag=`git tag -l | grep $newVersion` echo '################# 最近創建的標簽為:' $latestTag echo '################# 自動計算的標簽為:' $newVersion echo '################# 自動創建的標簽為:' $newTag echo **********************************End********************************** ##檢測版本號格式通過之后,根據構建時選擇的動作執行封版或合代碼動作 # 封版操作 echo ${Action} remote="origin" verBranch=${Version} testBranch="test" function createBranch(){ echo "============Delete local and remote test branche=========" echo "Removing local test branch..." git branch -d ${testBranch} echo "Removing remote test branch..." git push --delete $remote ${testBranch} echo "Switching to verBranch local branch..." git checkout -b $verBranch git commit -a -m "add ${verBranch}" git push --set-upstream origin ${verBranch} echo "Creating test Branch..." git checkout -b $testBranch git commit -a -m "add ${testBranch}" git push --set-upstream origin ${testBranch} } function MergeVersion(){ newBranch=${Version} echo "Merge $newBranch into test Branch..." git checkout $testBranch git merge origin/$newBranch || exit 1 git push --set-upstream origin ${testBranch} || exit 1 echo "Merge into test branch successful ..." } case $Action in CreateVersion) createBranch ;; MergeVersion) MergeVersion ;; esac
這就是構建合並封版的shell腳本,這里有個小坑就是,git 用戶每次拉取代碼都要輸入用戶名和密碼這樣會導致shell腳本失敗,所以我們需要配置git用戶免密登錄
普通用戶配置免密拉取 git 執行shell,那么要在jenkins Linux主機上執行這些命令
git config --global user.name "ops@batar.cn" git config --global user.password "123456" git config --global credential.helper store
這是授權普通用戶免密登錄git地址
構建任務
這里輸入需要封版或者合並的變量
Version這里輸入需要執行的版本,也可以在 job 里配置好默認值這樣就不用輸入,關於定時任務默認Version這里一定要輸入一個值,不然會導致失敗
創建好之后就不用去管理,配置好一個默認值每天定時去執行,是不是省去了很多人工~
本文分享完畢,感謝支持點贊~~