• jenkins多分支回滚总结文


    jenkins多分支回滚-总结文
      做了差不多一周的东西,今天算是搞完了,测试测得都有点晕了~~~
      可能大家会有点乱,最近这几篇jenkins分支版本号测试的文章,主要围绕的需求是:每次点击jenkins发布,能修改版本号文件(.env)的版本号,并同步回giltab,开发写的程序貌似会读这个文件,到时用户使用的时候会看到当前版本号。
      至于后面的多分支发布、jenkins控制台显示对应版本号,根据分支版本号备份,根据分支回滚想要的版本,这些通通都是我自己扩展想完善好的。前面几篇文章算是一步步走过的坑。
      这篇做个总结(之后五一要好好休息 = =),顺便介绍如何做到多分支回滚的,不知道有没有大bug,因为还没交差,小bug倒是想到一个。
      整个演示:模拟从选择多分支发布,备份旧版本号,最后回滚的场景。
      总共用到两个任务:多分支多版本号备份 和 多分支回滚。
    一、实现思路
    1、jenkins根据分支进行发布:
    (1)发布前jenkins控制台显示版本号:利用jenkins服务运行用户,根据选择发布的分支,显示目前版本号(old_version)和将要发布的版本号(new_version),不同的分支会读取不同的版本号文件:{项目关键字}-${分支号}_version.txt
      对应jenkins任务的“多分支多版本号备份”参数化构建过程的: old_version 和 new_version 定义
    (2)更新版本号,编译代码,并将版本号同步回gitlab上:向(1)的版本号文件写入:版本号、新版本号(new_ver)、发布时间,用于控制台下次发布显示版本号的;
      并且,jenkins运行用户通过ssh去调用jenkins服务器上的另一个普通用户的脚本,用于更新.env文件到gitlab上。
      对应jenkins任务的“多分支多版本号备份”构建配置里的:
    ssh {jenkins服务器上的一个普通用户}@{jenkins服务器上的ip} "sh -x /home/{普通用户}/scripts/update_version/update_admin.sh $branch"

      为什么用到该用户?主要是因为直接在jenkins工作区间,同步回.env文件到gitlab上,会报错,可以看回之前文章。

    (3)编译后得到发布到远程机器上的目录dist(里面有发布到远程的文件),新建一个发布信息文件(用于后面远程机器发布前备份的):version.txt,记录分支号,上一个版本号(old_ver),发布的版本号(new_ver),将dist目录和发布信息文件压缩成一个压缩包:{项目关键字}-${分支号}_${new_ver}.tar.gz
       突然发现version.txt 记录的 old_ver 是没用的,因为远程机器运行目录不一定是这个发布分支的上一个版本号
    2、远程机器备份和发布:发布压缩包会传到一个临时目录(DIST_DIR),远程机器事先会新建一个版本发布记录文件,这个文件是用于后面回滚的。
    版本发布记录文件命名:Deploy-{项目关键字}.log
    文件内容格式:项目关键字、版本号、当前发布版本号、发布时间(Deploy_Log)
      想想如果没有这个文件,就不知道当前运行目录究竟跑的是哪个分支的哪个版本号。回滚前的备份旧包就不好命名了。
     
    3、回滚:jenkins控制台根据选择的分支显示该分支的版本号,可以选择这版本号前的版本进行恢复。在jenkins构建配置里,要更新版本号文件:{项目关键字}-${分支号}_version.txt(用于下一次发布jenkins控制台显示版本号),且更新版本号文件到gitlab上(.env的版本号改为回滚的版本号)
    对应jenkins任务的“多分支回滚”构建配置里的:
    echo admin $branch ${rollback_version} $DATE rollback >> /var/lib/jenkins/scripts/xxx/get_version/admin/${branch}/admin-${branch}_version.txt

      行尾添加一个关键字rollback是为了区分正常发布的,例如下面的test分支,v1.0.6这行表示做了回滚v1.0.6的版本。

       更新.env到gitlab,对应构建里的

    ssh {jenkins服务器上的一个普通用户}@{jenkins服务器上的ip} "sh -x /home/{普通用户}/scripts/xxx/update_version/rollbackver_admin.sh ${branch} ${rollback_version}"

      远程机器运行回滚脚本,对应jenkins任务的“多分支回滚” 的“构建后操作”   :

    sh -x /home/xxx/script/test/rollback_admin.sh ${branch} ${rollback_version}

      去备份目录找到回滚的包名,备份原包(借助版本发布记录文件),再发布回滚包

    二、实现配置
    只贴关键,上几篇文章没提到的
    1、jenkins任务的:多分支多版本号备份 
    构建后操作的发布脚本:
     
    (1)发布脚本(远程机器上运行):  
    #!/bin/bash
    
    ## 版本号、分支号
    Branch=$1
    echo "发布分支:" $Branch
    
    ## 记录当前运行的分支和版本号
    Dir=/home/xxx/wars/muti-branch
    ## 有bug,不能分 ${Branch}存放, 要一起共用 #### Deploy_Log
    =${Dir}/Deploy-admin-${Branch}.log

      Deploy_Log=${Dir}/Deploy-admin.log

    
    ## jenkins拷贝过来的临时目录
    DIST_DIR=/home/xxx/wars/admin
    cd ${DIST_DIR}
    
    Tar_FileName=`ls -lht *${Branch}*.tar.gz | head -n1 | awk '{print $9}'`
    
    ## 解压目录名
    FileName=`echo ${Tar_FileName/.tar.gz/}`
    tar -xvf ${Tar_FileName}
    
    cd ${FileName}
    
    ## 获取上一次和这次的版本号, old_version 是不需要记录的
    ### old_version=`cat version.txt | awk '{print $2}'`
    new_version=`cat version.txt | awk '{print $3}'`
    
    DATE=`date +%Y%m%d_%H:%M:%S`
    
      ## 获取对上一次发布的分支号,上面的 old_version 是错的,不一定上次发布是同一个分支
    lastBranch=`tail -n1 ${Deploy_Log} | awk '{print $2}'
    lastVersion=`tail -n1 ${Deploy_Log} | awk '{print $3}'`
    # 写入版本发布记录文件
    echo admin ${Branch} ${new_version} ${DATE} >> ${Deploy_Log} ## 备份目录 BAK_DIR=/home/xxx/data/bak/xxx #备份目录,不存在就创建 [ ! -d $BAK_DIR ] && mkdir -p $BAK_DIR ## 发布目录 DEPLOY_DIR=/home/xxx Admin_DIR=${DEPLOY_DIR}/admin ## 1、备份原目录 if [ -d ${Admin_DIR} ]; then if [ ! -d ${BAK_DIR}/admin ]; then mkdir -p ${BAK_DIR}/admin fi /bin/mv ${DEPLOY_DIR}/admin ${BAK_DIR}/admin/admin-${lastBranch}_${lastVersion}_$DATE fi ## 2、发布目录,不存在就创建 [ ! -d ${Admin_DIR} ] && mkdir -p ${Admin_DIR} ## 3、发布代码 /bin/cp -rp ${DIST_DIR}/${FileName}/dist/* ${Admin_DIR}/

    exit 0
     
    2、jenkins任务的:多分支回滚
    (1)构建
    注意:这个rollbackver_admin.sh 是在 jenkins服务器上的普通用户运行

    更新回滚版本号到gitlab脚本(jenkins机器上运行)

    rollbackver_admin.sh

     1 #!/bin/bash
     2 
     3 #######################################################
     4 # $Name:        rollback_admin.sh
     5 # $Version:     v1.0
     6 # $Function:    回滚:xxx项目的-前端版本号
     7 # git目录:     /home/xxx/app/update_version/
     8 
     9 #######################################################
    10 
    11 ## 1、拉取的分支
    12 Rollback_Branch=$1
    13 Rollback_Version=$2
    14 
    15 
    16 ## 2、拉取的目录,项目名
    17 Git_Dir=/home/xxx/app/update_version/xxx
    18 Admin_Dir=${Git_Dir}/admin
    19 
    20 cd ${Git_Dir}
    21 
    22 ## 不存在就克隆仓库
    23 if [ ! -d ${Admin_Dir} ]; then
    24    git clone -b ${Pull_Branch} ssh://xxx/xxx/xxx.git
    25 
    26 ## 存在就判断是否是回滚分支
    27 ## 更新最新代码
    28 else
    29    cd ${Admin_Dir}
    30    br=`git branch |grep "*"`
    31    localbr=`echo ${br/* /}`
    32    
    33    # 切换到回滚分支
    34    if [ "${localbr}" != "${Rollback_Branch}" ]; then
    35        git checkout ${Rollback_Branch}
    36    fi
    37    # 更新回滚分支的最新代码
    38    git pull origin ${Rollback_Branch}
    39 fi
    40 
    41 ## 3、更新版本号
    42 cd ${Admin_Dir}
    43 src_ver=`cat .env |awk -F'=' '{print $2}' | tr  -d "'"`
    44 sed -i "s/${src_ver}/${Rollback_Version}/" .env   
    45 
    46 ## 4、上传代码
    47 git add .env
    48 git commit -m "rollback .env version"
    49 git push origin ${Rollback_Branch}:${Rollback_Branch}
    View Code
    (2)构建后操作
     
    远程机器上运行:
    rollback_admin 脚本
    #!/bin/bash
    
    #######################################################
    # $Name:        rollback_admin.sh
    # $Version:     v1.0
    # $Function:    根据选择的分支,回滚版本号
    
    #######################################################
    
    ## 0、参数传入,变量定义
    # 传入回滚版本号、分支号
    Branch=$1
    Rollback_Version=$2
    DATE=`date +%Y%m%d_%H:%M:%S`
    
    # 版本发布记录文件, 回滚也写
    Dir=/home/xxx/wars/muti-branch
    Deploy_Log=${Dir}/Deploy-admin.log
    
    # 总备份目录
    BAK_DIR=/home/xxx/data/bak/xxx
    Admin_BAK_DIR=${BAK_DIR}/admin
    
    # 发布目录 - 测试ljy
    DEPLOY_DIR=/home/xxx
    Admin_DIR=${DEPLOY_DIR}/admin
    
    ## 1、找回滚的包名,不需要解压
    Rollback_Pkg=`ls -lht ${Admin_BAK_DIR} | grep "admin-${Branch}_${Rollback_Version}" | head -n1 |  awk '{print $9}'`
    if [ -z "${Rollback_Pkg}"  ]; then
        echo "找不到回滚的包,退出程序!!!"
        exit 1
    fi
    
    ##找到要回滚的包名
    echo "要回滚的包名:" ${Rollback_Pkg}
    
    ## 2、回滚包
    #2.1 备份原包
    ## 原包的版本号
    ## 最后一行是上次发布包版本
    old_version=`tail -n1 ${Deploy_Log} | awk '{print $3}'`
    
    ### 有bug,不是用传过来的 ${Branch},而是 ${Deploy_Log} 最近一行的分支名
    #### mv ${Admin_DIR} ${Admin_BAK_DIR}/admin-${Branch}_${old_version}_rollbackto_${Rollback_Version}_$DATE
    
    lastBranch=`tail -n1 ${Deploy_Log} | awk '{print $2}'`
    mv ${Admin_DIR} ${Admin_BAK_DIR}/admin-${lastBranch}_${old_version}_rollbackto_${Rollback_Version}_$DATE
    
    
    #2.2 发布回滚包
    # 回滚包
    cd ${Admin_BAK_DIR}   #进去备份目录
    
    # 发布回滚包
    [ ! -d ${Admin_DIR} ] && mkdir -p ${Admin_DIR}
    cp -rp ${Rollback_Pkg}/* ${Admin_DIR}/
    
    # 该文件用于测试
    echo ${DATE} ${Rollback_Version} 回滚 >> ${Admin_DIR}/testfile
    
    
    ## 3、更新版本发布记录文件
    echo admin ${Branch} ${Rollback_Version} $DATE rollback >> ${Deploy_Log}

     Deploy-admin.log 记录内容示例:

    、回滚测试效果图

     分支test,当前运行的版本号为:v1.0.8,需要回滚到v1.0.6
    1、远程机器上记录了最近一次发布包的分支和版本号
    Deploy-admin.log

     2、备份目录有之前的备份包:

    其中v1.0.6的文件时间为:2022年 4月 27日的 16:18

     3、多分支回滚

     

      4、发布完检查:

    (1)gitlab版本号更新:
    从 1.0.8 变为 1.0.6

     (2)控制台显示当前版本号为:v1.0.6

     (3)jenkins机器版本信息记录文件

    最后标记(rollback)代表回滚了该版本号

    (4)远程机器检查:

    (i)运行目录恢复了v1.0.6的文件:

     用于标记回滚成功的测试文件(testfile)也存在

     

    (ii)当前运行目录的版本记录文件(对上一次发布的版本)
    更新了最近一次是回滚的版本号

     (iii)备份目录有回滚前的运行目录版本号的备份包(v1.0.8)

    rollbackto_v1.0.6,跟正常发布备份区分开

      注意:版本回滚读取的分支号要从 ${Deploy_Log} 最新一行去取,而不是直接根据传入的版本参数进行备份,已修正发布脚本和回滚脚本的:${Deploy_Log}

      如果有其他bug,欢迎读者指出,不胜感激~~~ 【^___^】 

  • 相关阅读:
    Django Rest framework基础使用之Request/Response
    Django Rest framework基础使用之 serializer
    python基础(一)
    python实现本地图片上传到服务区
    开发中遇到的问题记录
    九、xadmin菜单分组管理
    leetcode-7-整数翻转
    leetcode-6-Z 字形变换
    leetcode-5-最长回文子串
    leetcode-3-无重复字符的最长子串
  • 原文地址:https://www.cnblogs.com/windysai/p/16204887.html
Copyright © 2020-2023  润新知