Jenkins封版合並Git代碼


最近接到一個新需求,通過 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這里一定要輸入一個值,不然會導致失敗

創建好之后就不用去管理,配置好一個默認值每天定時去執行,是不是省去了很多人工~

 

本文分享完畢,感謝支持點贊~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM