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
当我欢欢喜喜交差的时候,领导又说,还是不要这么搞了,到时测试人员和开发人员都在开发库新增数据,测好再导入到测试库,最后再导入到试运行库。
叫我明天手动配合测试人员做好这个测试流程,再搞这个自动化过程,当时整个人都不好了 = =
前天确认过明明说好是这么干,现在搞好了,才说不要,终于明白开发为啥跟需求不共戴天。。。今晚需要静静