问题描述
开发环境下,自动部署引发血案,通过网关调用服务接口出现错误找不到资源。
问题根源
启动jar和每次构建的jar不是同一个
- 部署环境,基于docker,jenkins,git,maven等组件自动构建;
- 开发人员提交代码,系统自动构建启动;
- 开发人员多次修改pom文件的 <artifactId yw-routing /artifactId>
- jenkins自动捕捉git的push事件,导出生成多个jar,如:yw-routing.jar; yw-rout.jar;
- docker生成镜像,将多个版本的jar打入镜像中;
- docker 启动执行的脚本中需要入参指定启动的jar包名称, nohup jar -jar $1(jar变量);
- 此时传入的jar包名称并非最新的jar包名称,导致最新代码无法部署到开发环境;
解决方案
- 生成新的镜像时,每次只保留最新jar;此方案能只能保证服务启动时出现异常,找不到指定jar包;
- 写死的启动参数变成动态参数,每次获取最新的jar包名称当做变量传入启动脚本中,此方案能从根本上解耦开发和运维的职能;
问题分析过程
- 确保代码已提交到指定分支,检查git库中的对应接口代码是否存在;
- 确保网关可以路由到指定服务检查网关服务是否正常;
- 确保本地调试通过,测试本地通过网关请求相同接口;
- 确保指定服务下的接口能够掉通,缩小问题范围,测试开发环境同一个服务下的其他接口;
- 以上均正常则基本可以确定是部署出现问题,即最新代码并未成功部署;
- 进入docker内部查看jar包反编译看是否存在最新代码,结果发现多个jar包;
- 确保启动jar为最新jar,分析发现启动jar一直未历史版本,至此问题定位成功;