zoukankan      html  css  js  c++  java
  • 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这里一定要输入一个值,不然会导致失败

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

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

  • 相关阅读:
    Realtime crowdsourcing
    maven 常用插件汇总
    fctix
    sencha extjs4 command tools sdk
    首次吃了一颗带奶糖味的消炎药,不知道管用不
    spring mvc3 example
    ubuntu ati driver DO NOT INSTALL recommand driver
    yet another js editor on windows support extjs
    how to use springsource tools suite maven3 on command
    ocr service
  • 原文地址:https://www.cnblogs.com/mike666/p/13630820.html
Copyright © 2011-2022 走看看