本文主要是介绍CI/CD平台,部署中空格引发的两个血案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. 前端static部署
微服务前端js,编译打包成的tar包,在部署阶段,需要解压缩到与这个微服务对应的location,这个过程分别在流水线的“代码打包”和“部署”这两个阶段完成。
代码打包:
通过下面的命令完成:
cd xxx-yyy && yarn --update-checksums && yarn && yarn build_test && cd dist && tar -czf ../xxx-yyy.tar.gz .
部署:
webDir="/data/website/${env}/${location}"
mkdir -p ${webDir} && rm -rf ${webDir}/* && tar -xf ${package} -C ${webDir}/
env一般是dev和test环境,假如location是:index,结果是生成目录: /data/website/dev/index,解压缩tar包到这个目录下。
在开发环境,偶尔会出现所有的前端静态目录都被删除的情况,即:/data/website/dev目录被干掉了。真是狗血,所有的前端得全部构建部署一遍。
经过排查,原来是这里的问题:
mkdir -p ${webDir} && rm -rf ${webDir}/* && tar -xf ${package} -C ${webDir}/
这个webDir,webDir="/data/website/${env}/${location}",其中的参数location是在平台的web页面上配置的,如下图:
这个location的文本前面,有个空格,webDir是个组合成的字符串,会变成“/data/website/dev/ index”。
好了,问题就是,在rm -rf ${webDir}时,命令行是这样的: rm -rf /data/website/dev/ index,就把webDir="/data/website/${env}/${location}"给干掉了。
2. 后端部署
微服务后端是生成docker镜像后,以容器的形式部署在k8s集群中。
部署的过程中,通过webconsole查看日志,会出现这样的错误:
查看容器的状态:
排查:
1)是不是这个jar包不存在???
直接docker运行这个镜像,问题也一样。查看这个jia包,是存在的。
2)看看这个jar包可以创建进程不???
这个jar应该也没有问题。
3)是不是docker镜像的缺省entrypoint的参数,或者k8s的容器启动命令或者参数配置有问题???
由于这个应用是配置了启动命令和参数的,因此会替换镜像缺省的entrypoint,继续查看容器的启动命令和参数:
原来是启动命令行指定的jiar包名称“xxx.jar ”,jar后面多了个空格。 而通过go模板生成服务yaml时,这个空格会被认为是jar包名称的一部分,最终k8s创建容器后,启动的命令行也会
去那这个“xxx.jar ”的jar 包,自然这个jar包是不存在的。
思考:
为啥一个简单的空格,引起的问题这么严重,排查也花了蛮久时间呢?
这样的低级错误,在开发过程中,就没有注意到?在写代码时,参数应该做些怎样的检查?字符串的处理应该怎么写?
思考问题不够严谨,停留于功能的实现,没有精益求精。
这篇关于CI/CD平台,部署中空格引发的两个血案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!