最近接到一个新需求,通过 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

Jenkins封版合并Git代码-冯金伟博客园

输入这些变量就可以,是为了运行后面的 shell 脚本

源码地址

这里输入需要合并封版的源码地址和有权限操作这个分支的用户密码

Jenkins封版合并Git代码-冯金伟博客园

我这里是需要 master 分支做为源分支,封版都是根据这个分支来创建,你们可以自行修改源分支

创建定时任务

定时任务是每天自动构建合并和封版你需要操作的分支

Jenkins封版合并Git代码-冯金伟博客园

我这里创建的定时任务是每天下午 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地址

构建任务

这里输入需要封版或者合并的变量

Jenkins封版合并Git代码-冯金伟博客园

Version这里输入需要执行的版本,也可以在 job 里配置好默认值这样就不用输入,关于定时任务默认Version这里一定要输入一个值,不然会导致失败

创建好之后就不用去管理,配置好一个默认值每天定时去执行,是不是省去了很多人工~

本文分享完毕,感谢支持点赞~~