一、背景
最近工作的五年,无论何时何地工作,总之测试已经离不开干运维的工作,或许也是没有界定测试和运维的工作部分,比如说:在linux服务器需要操作某些文件或服务时,总是习惯性的写出一长穿命令来偷懒,结果如下:
. /etc/profile.d/java11.sh && for dir in `ll |grep ^d|awk '{print $9}'`;do cd $dir; mvn -s "/usr/local/maven/conf/xxxx-test.xml" clean package -Dmaven.test.skip=true -Plockin-test; if [ $? -eq 0 ]; then cd ..; else exit 0; fi ; done
这要是放在别人眼里,没有编程基础或者是没有储备多少linux指令的同学来说,看起来有些费劲,那么如何优雅的体现呢?为什么又要写成一长串呢?
二、分析&实现
原因竟然是:当前脚本属于一次性的,那么如何优雅,唯shell脚本而已,将上面一长串linux命令优化如下:
#!/bin/sh
# 引申环境变量
. /etc/profile.d/maven.sh
. /etc/profile.d/java11.sh
# 遍历目录 ^d 匹配
for dir in `ll |grep ^d|awk '{print $9}'`
do
cd $dir
# 进入目录构建服务
mvn -s "/usr/local/maven/conf/xxxx-test.xml" clean package -Dmaven.test.skip=true -Plockin-test
# 如果构建成功则继续返回上层,否则退出
if [ $? -eq 0 ]; then
# 成功叫jar包传输到服务器上
rsync -avz target/*.jar xxxx@192.168.12.11:/home/xxxx/jar_server_java/
cd ..
else
exit 0
fi
# 循环、条件结束符
done
三、苦恼又暗自欣喜
相比之前工作,通过靠兼职运维而涨薪,需要负责公司的运维工作,不管是本地环境还是云服务器,总是要忙忙碌碌,四处救火,有时呢也是清闲,所以能明白环境问题带来的忙碌,有时可能是一周,当然有人会说了,为啥需要这么久时间?呵,这个也没法解释,如果要怪就怪自己手贱,或者是没有做好备份策略。
好在现在的工作,有运维岗位了,只是可能不太熟练这些项目的部署方式和意义,所以在恢复环境过程中遇到无法解决的问题,同时需要开发和测试来协助,所以这时候题主又携带着运维技能上场了。
四、学会了新技能
题主部署过java项目、python项目,当然还有前端vue项目,不管是node管理器还是mvn构建工具,也会遇到一个个不曾见过的难题,好在都能一一找到解决方案。
学习插件:Pipeline Stage View
如上图所示,在没有写流水线之前,咱们一直在说CI/CD,实现的也很低级:单个服务实现git仓库与jenkins之间相互调用,但是咱们并没有直接上线,不能说开发提交代码了,然后就直接部署生产,至少中间需要经过一轮测试验证,所以题主认为正确的思路就是:开发提交代码(单元测试)–测试环境拉取代码部署–测试验证环节(接口/UI自动化)–上线生产环境–验收测试(接口/UI自动化)
pipeline {
agent any
environment {
GITURL = '全局git地址'
}
stages {
stage('第一个job') {
steps {
build job: 'test-a', parameters: [
[$class: 'BooleanParameterValue', name: 'confirm', value: 'true'],
[$class: 'GitParameterValue', name: 'commit_id', value: "${commit_id}"]
]
}
}
stage('第二个job') {
steps {
build job: 'test-b', parameters: [
[$class: 'BooleanParameterValue', name: 'confirm', value: 'true'],
[$class: 'GitParameterValue', name: 'commit_id', value: "${commit_id}"]
]
}
}
}
}
Pipeline这个流水线插件,在这次工作中学习了,突然发现它并高深,大道至简,所以工具还是工具,永远都要服从人的思想工作。
五、技能扩展
- 系统服务service找出来,批量执行stop && start
find /lib/systemd/system -name "xxxx*"|awk -F "/" '{print $5}'|xargs systemctl stop
- 查找文件,批量删除
find ./xxxx*/log/* -name "*202*" |xargs rm -rf {
}/;
- 过滤文件内容
grep -R xxxx-s5 */config.xml
- 批量替换
grep -R xxxx-s5 */config.xml |awk -F ":" '{print$1}'|xargs sed -i 's/xxxx-s5/xxxx-test/g'