• 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

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

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

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

     

  • 相关阅读:
    结构化建模分析
    qemusystemriscv64 machine \?
    git clone commit
    riscv gdb machine mode
    error: src refspec main does not match any.
    riscv ecall
    git windows
    fixedlink
    iperf交叉编译
    每日学习
  • 原文地址:https://www.cnblogs.com/windysai/p/16079452.html
Copyright © 2020-2023  润新知