jenkins控制库连接后-数据备份
接上文:jenkins控制库连接
上文提到,如果测试人员测试流程,会借用到临时库来存放开发库的数据,测完之后是想备份起来的,以便恢复某个测试状态。
这个看着简单很多,根据选项参数去做备份即可,不过有些细节需要注意下:
首先,加个判断,对于最近一次发布是测试流程才去备份,此时要判断这个文件是否有临时库关键字: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点,还是无果,以前做程序设计经常这么干的)
然而,一直报错。。。
当时打印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必须为字符串,但这里输出为 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
当我欢欢喜喜交差的时候,领导又说,还是不要这么搞了,到时测试人员和开发人员都在开发库新增数据,测好再导入到测试库,最后再导入到试运行库。
叫我明天手动配合测试人员做好这个测试流程,再搞这个自动化过程,当时整个人都不好了 = =
前天确认过明明说好是这么干,现在搞好了,才说不要,终于明白开发为啥跟需求不共戴天。。。今晚需要静静