ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

jenkins控制库连接后-数据备份

2022-03-31 22:01:45  阅读:177  来源: 互联网

标签:pipeline remote imageStatus 数据备份 echo sh jenkins 连接


jenkins控制库连接后-数据备份

       接上文:jenkins控制库连接(https://www.cnblogs.com/windysai/p/16079301.html)

  上文提到,如果测试人员测试流程,会借用到临时库来存放开发库的数据,测完之后是想备份起来的,以便恢复某个测试状态。

  这个看着简单很多,根据选项参数去做备份即可,不过有些细节需要注意下:

  首先,加个判断,对于最近一次发布是测试流程才去备份,此时要判断这个文件是否有临时库关键字:tmp,也就是下面这个文件:

(可以留意下上文的pipeline代码,如果是测试流程,会有个用连接临时数据库覆盖文件的动作)

/var/lib/jenkins/workspace/pipeline任务名/项目目录/src/main/resources/application-test.properties

  另外就是领导想保留最近10个备份文件即可,我写的多是保留最近几天的。。。

     想法是有了,实现起来挺多坑。这里先感谢一下小俊子给我的帮助 [ ^_^ ]  

实现

  1、还是用到jenkins的选项参数,给测试人员去选测试“流程“还是测试”功能“,选”流程” 则判断jenkins 项目该文件:application-test.properties 是否是有临时库的关键字。是的话,就代表最近一次发布是测“流程”,否则就是测”功能“(连内测库)

  2、判断好最近一次发布是测“流程”后,就可以调用远程脚本去备份测试好的临时库了。

  然而,pipeline写起来并不简单(可能本人比较菜。。)

  遇到的困难是,用 sh ''' 把判断文件关键字的命令括起来,在 ''' 里面就调用不了sshCommand 的命令

(即框住的两行写到箭头下面)

   昨晚是有捣鼓用pipeline的全局变量去解决,也就是在 if [ "$judge}" != ]  里面借助修改全局变量的值来标记(如,有关键字则:flag=1),然后在sh ''' 代码块后面再利用标记去调 sshCommand,上图那个env.FLAG 就是我做的无谓挣扎 = = (昨晚搞到11点,还是无果,以前做程序设计经常这么干的)

  然而,一直报错。。。

  后来找到这个参考链接:https://www.cnblogs.com/chenyishi/p/10943352.html

   当时打印exitValue的值,发现为空的,几经波折,精神接近崩溃,最终请教了小俊子。

  给了这个模板我(跟上面的截图很像)

imageStatus = sh (script: "curl xxxx | grep 'not found'", returnStatus: true)
if (imageStatus == '0' ) {
    println 11111
}

  我改成这样:

imageStatus = sh (script: "head -n 2  /var/lib/jenkins/workspace/pipeline任务名/项目目录/src/main/resources/application-test.properties |grep 'xxx_tmp'", returnStatus: true)

   以为问题完美解决,后来才发现这个 imageStatus 怎么样输出都是 0,因为这个命令的意思就是执行 ”head。。。grep" 是否成功,肯定成功的呀,因为命令是没有语法错误的。

   想到应该后面再接管道符,再echo $? 去判断的(记得做转义),然后又是报错

 

   最后小俊子告诉我要转类型,echo必须为字符串,但这里输出为 int

         后面加了这条,问题得以解决:

String imageStatus = String.valueOf(imageStatus)

  最后贴代码:

def GetRemoteServer(ip){
    def remote = [:]
    remote.name = ip
    remote.host = ip
    remote.port = 自建数据库服务器的ssh端口
    remote.allowAnyHosts = true
    //通过withCredentials调用Jenkins凭据中已保存的凭据,credentialsId需要填写,其他保持默认即可
    withCredentials([usernamePassword(credentialsId: '事先配置在jenkins 的自建数据库服务器的账号密码凭据', passwordVariable: 'password', usernameVariable: 'userName')]) {
        remote.user = "${userName}"
        remote.password = "${password}"
    }
    return remote
}

pipeline {
     agent any  
     stages {
        stage("最近一次发布是测试“流程”,则备份数据库") {
            steps {
                  script {
                 // 获取测试人员测试选项 
                    echo "{env.choice}"
                    if (env.choice == "流程") {
                        echo "最近一次发布"
                        
                        imageStatus = sh (script: "head -n 2  /var/lib/jenkins/workspace/pipeline任务名/项目目录/src/main/resources/application-test.properties |grep '数据库名_tmp'; echo \$?", returnStatus: true)             
 
                        // 类型转换!!
                        String imageStatus = String.valueOf(imageStatus)
                       
                     
                        echo "返回状态:" 
                        echo imageStatus
                        //返回0,代表最近一次发布是tmp
                        if ( imageStatus == '0' ) {
                             echo "开始备份...."
                             rserver = GetRemoteServer('自建数据库服务器ip')
                             sshCommand remote: rserver, command: "sh -x baktmp.sh" 
                        }
                    }
                    else {
                        echo "最近一次发布是测试功能,不备份数据库"
                    }
                    
                  }
            }
        }
       
        }
}

      数据库备份脚本:baktmp.sh 有个保留最近10个文件的判断,也摘录一下代码段:

## 2、只保留最近10个库数据
save_num=10
total_num=$(ls -l ${Bak_Dir} |sed 1d |wc -l)

#文件个数超过10个则删除
if [ ${total_num} -gt ${save_num} ]; then
   #获取删除的文件名 
   ls -t ${Bak_Dir} | awk "{if(NR>$save_num) {print $1}}" >> ${Log_Dir}/del_name.log
   
   #删除文件
   cd ${Bak_Dir}
   ls -t ${Bak_Dir} | awk "{if(NR>$save_num) {print $1}}" |xargs rm -rf 

fi

  当我欢欢喜喜交差的时候,领导又说,还是不要这么搞了,到时测试人员和开发人员都在开发库新增数据,测好再导入到测试库,最后再导入到试运行库。

叫我明天手动配合测试人员做好这个测试流程,再搞这个自动化过程,当时整个人都不好了 = =

  前天确认过明明说好是这么干,现在搞好了,才说不要,终于明白开发为啥跟需求不共戴天。。。今晚需要静静

 

标签:pipeline,remote,imageStatus,数据备份,echo,sh,jenkins,连接
来源: https://www.cnblogs.com/windysai/p/16079452.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有