前言
直接说问题,不知道大家有没有遇到过,开发本地以及公司的测试环境都没问题,但是更新到客户那边就会有问题的情况?最近,本人有幸遇到过[打脸]。
事情是这样的,有个项目比较旧,而且刚开始的周期比较紧,所以我们自己的测试环境都是由开发自己在本地build之后,上传到测试环境直接通过nginx 进行代理发布的。但是,测试完成后,客户那边要求通过他们自己环境的jenkins 走自动化构建,所以就导致开发、测试、交付环境不一致,更新过去,有些功能有问题[石化][石化][石化]。
定位问题
根据经验,判断应该是build环境不一致,在install 依赖的时候,不同的环境、node版本导致有些依赖安装失败导致的,梳理出来之后,需要处理以下几个问题:
- 操作系统不统一的问题,不同的操作系统,node 安装依赖有些是不一样的[吐]
- node 版本不一致的问题
经过跟甲方的运维沟通,得到的jenkins环境配置:
- 操作系统: Ubuntu ,开发是win,测试环境是Linux
- node 版本: 16+ ,开发是 v14.x.x的版本
经过沟通协商,运维同意安装node:v14的版本,但是操作系统不统一的问题,肯定是无解的(不可能因为你,甲方给你重装jenkins环境的操作系统[黑线])。
呐,可能有的同学已经想到了,用docker去解决啊[狗头],没错就是用docker去解决,经过沟通,docker的情况如下:
- jenkins 有docker环境
- 部署服务器没docker环境(也别想着让甲方装[呆无辜]),所以不能按常规的跑docker镜像
思考中[灵光一闪][灵光一闪][灵光一闪].......
解决问题
经过问题梳理确定了通过docker去解决的方案,那就需要梳理,docker 需要处理哪些问题?
- 统一node版本,v14.21.3
- 在容器内容进行项目的编译打包,npm install、npm run build
- 将容器中编译好的dist导出到宿主机并进行压缩(jenkins)
- 将dist.tar.gz 上传到目标服务器进行发布(jenkins)
解决以上问题,就可以解决编译环境不统一、部署服务器没有docker环境的问题,上代码:
Dockerfile:
# 统一编译环境
FROM node:14.21.3-alpine3.17
WORKDIR /app
COPY ./ .
RUN rm -rf node_modules
RUN npm cache clean -f
RUN npm install --registry https://registry.npmmirror.com
RUN npm run build
jenkins 构建脚本:
# 构建镜像
docker build -t qxjt_medium:v1.0.0 .
# 启动容器
docker run --name qxjt_medium -d qxjt_medium:v1.0.0
# 将容器中构建好的dist cp 到宿主机的相应目录
docker cp qxjt_medium:/app/dist /Users/username/developer/docker/data
# 删除容器
docker rm qxjt_medium
# 删除镜像
docker rmi qxjt_medium:v1.0.0
# 压缩dist 目录
cd /Users/username/developer/docker/data
tar -zcvf dist.tar.gz dist
经过这一波操作之后,更新过去,所有功能都正常了。
结语
无论是开发问题还是需求分解,总结一条处理流程就是:
发现问题(需求分析) --> 问题解决方案(开发方案) --> 问题处理(方案落地实施)。