Linux教程

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

本文主要是介绍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

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

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

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

 

这篇关于jenkins控制库连接后-数据备份的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!