借助docker在本地模拟线上CI/CD流水线编译流程
admin
2024-01-29 02:29:39
0

1 背景

公司采用jenkins主从集群实现CICD流程,其中Jenkins Master部署在服务器上,Jenkins Slave 以 Pod 形式运行在 Kubernetes 集群的 Node 上。其优点在于可以通过自定义的从属pod来隔离编译/打包/运行环境,实现多语言/多版本的编译,多环境的部署(阿里云、华为云、k8s)。

然而实际过程中由于依赖变动、网络故障等等因素,线上CI/CD发布项目时偶尔出现编译失败的问题,而研发难以定位到是项目本身的问题还是其它问题导致。

2 解决方案

基于docker在本地构建编译环境,模拟线上CI/CD编译流程,快速定位编译失败的问题。

例如,前端项目可基于node14/16构建镜像,后端项目基于mvn镜像(挂载settings.xml)即可完成编译流程,无需在机器上繁琐的安装各种环境。

3 具体步骤

本文以测试前端项目为例,模拟线上流水线编译流程,并部署至测试服务器。研发/测试同学可据此文档本地编译部署、排查线上【编译失败】等问题。

3.1 获取编译及启动方式

首先与研发/运维沟通,获取编译环境、编译命令及启动命令,一般研发本地与线上jenkins流水线的编译方式一致

① 编译

# 环境,将以此为基础镜像构建
node14.11# 域名:
test-fe.net# 编译命令:
npm install
npm run build# nginx配置(略)

② 启动
本项目将打包好的dist文件夹置于工作目录下,通过nginx代理即可。

3.2 定制镜像(仅首次需要)

① 配置镜像仓库加速器(可选)
配置镜像仓库加速器(阿里云),提升获取Docker官方镜像的速度

vim /etc/docker/daemon.json
------{"registry-mirrors": ["https://ohdpuoqu.mirror.aliyuncs.com"]
}------
# 重启docker
systemctl restart docker

② Dockerfile
进入工作目录,创建node14编译环境的Dockerfile,相同编译环境项目都可使用该容器编译

# 进入仓库目录
cd /data/web/repo
# 创建node14文件夹
mkdir node14
cd node14
# 创建Dockerfile
vim Dockerfile
-------------------------FROM node:14.11.0
maintainer lc# 构建参数
ARG WORK_PATH="/app"# 设置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone# 替换为阿里源并安装必要工具
RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list  \&& apt update -y \&& apt-get install -y curl vim telnet# 解决vim中文乱码、ll命令
RUN echo "syntax on \nset termencoding=utf-8 \nset encoding=utf8 \nset fileencodings=utf8,ucs-bom,gbk,cp936,gb2312,gb18030" >> ~/.vimrc  \&& echo "alias ll='ls $LS_OPTIONS -l'" >> ~/.bashrc# 设置git全局参数、并记住密码
RUN git config --global user.name "test" \&& git config --global user.email test@local \&& git config --global credential.helper store#设置工作目录
WORKDIR $WORK_PATH# 继承基础镜像
ENTRYPOINT ["docker-entrypoint.sh"]
CMD [ "node" ]-----------------
# 制作镜像
docker build -t node-build:14.11.0 .

③ 运行
将容器中的项目挂载至本地,方便调试及后续编译目录的拷贝部署

docker run -tid --name node-build  -v /data/web/repo/node14/mnt:/app node-build:14.11.0

3.3 编译

① 进入相应编译环境的容器

docker exec -it node-build bash

② clone项目(http/https,ssh需额外配置)

git clone http://gitlab.xxx.net/xxxx/test-fe.gitcd test-fe# 若有必要,切换至相应commitid
git checkout 

③ 编译

npm install # 与研发确认测试环境打包命令
npm run build:test

④ 编译完成后,退出容器

3.4 部署项目

① 部署项目

# 进入挂载目录
cd /data/web/repo/node14/mnt/test-fe# 创建工作目录
mkdir -p /data/web/test-fe# 拷贝刚才编译好的文件至项目工作目录
/bin/cp -rf /data/web/repo/node14/mnt/test-fe/dist/ /data/web/test-fe/

② 配置nginx(nginx亦可容器方式部署)
考虑到后续项目越来越多,在server目录下,通过文件夹区分项目组(与线上一致),因此需修改nginx默认配置:

vim /opt/openresty/nginx/conf/nginx.conf
------include     servers/*.conf;改为include     servers/*/*.conf;

③ 新增路由
创建conf文件

cd /opt/openresty/nginx/conf/servers/
mkdir test-fe
vim test-fe.conf

http

server {listen          80;server_name     test-fe.net;index           index.html;root            /data/web/test-fe/dist;access_log      logs/test-fe.access.log  main;add_header Strict-Transport-Security "max-age=864000";location  / {try_files $uri $uri/ /index.html;}
}

④ 重启nginx

# 验证配置
/opt/openresty/nginx/sbin/nginx -t# 验证通过后,重启nginx
/opt/openresty/nginx/sbin/nginx -s reload

4 扩展

本文提供了一种供研发/测试在本地排查线上流水线编译失败的方法,也帮助了解流水线工作方式。纯手工操作,后续考虑将上述步骤集成到gitlab-ci中,通过指定tag,提交代码后能自动编译代码并部署至测试环境。

相关内容

热门资讯

宁波一游乐园内装饰树起火,工作... 7月6日,多位网友在社交平台发视频称,浙江宁波罗蒙环球乐园一棵圣诞树突然起火。 现场视频显示,一处游...
快乐不放假 公园玩一夏 全市4... 深圳新闻网2025年7月7日讯(深圳商报记者 文灿)7月5日,深圳公园“快乐不放假,公园玩一夏”夏日...
为了帮女儿照顾孩子,我和儿媳妇... 为了帮女儿照顾孩子,我和儿媳妇闹翻了01 “带着你的外孙走。” 一声尖锐的叫喊声过后,传来门被重...
孩子课上听不懂老师讲的怎么办? 孩子课上听不懂老师讲的怎么办?到外面培训机构培训一下,比如新东方教育之类的孩子刚上一年级,课上听不懂...
安徽一爸爸火车上睡着,儿子走丢... 安徽一爸爸火车上睡着,儿子走丢了都不知道,爸爸带娃到底有多靠谱?实在是太不靠谱了,这样的行为实在是太...
大家支持小学生向老师举报、告状... 大家支持小学生向老师举报、告状、告密吗?我个人不支持这样的做法,这样有个弊端,可能把孩子引向一个背后...
麻烦各位推荐几本好看的穿越小说 麻烦各位推荐几本好看的穿越小说绾青丝 独步天下 醉玲珑 丑颜倾城芊泽花,醉玲珑,跨过千年来爱你,暴...
星际战甲怎么一键分解所有重复m... 星际战甲怎么一键分解所有重复mod对着mod,按鼠标中键,即可全选该mod。按重复数量排序,即可方便...
电视剧《五星大饭店》有续集吗?... 电视剧《五星大饭店》有续集吗?是什么结局啊?没有续集。话说没有拍续集的打算。一般现在看的续集都是网友...
高中会考没过就一定没高中毕业证... 高中会考没过就一定没高中毕业证吗?高中会考没过就一定没高中毕业证吗不一定那,没过也可以领的当然不是,...
为什么我的仙剑奇侠传四玩道慕容... 为什么我的仙剑奇侠传四玩道慕容紫英那就卡掉,不能继续啊?我仙四一到紫英那放动画那就卡住,然后关闭了啊...
YES!光之美少女5GOGO有... YES!光之美少女5GOGO有哪些剧场版有YES,光之美少女剧场版1、光之美少女剧场版2、光之美少女...
住家保姆的服务内容有哪些 住家保姆的服务内容有哪些这个要跟保姆自己谈了要看你给的价格了
钓鱼坠子的制作方法有什么? 钓鱼坠子的制作方法有什么?进行海竿抛钩时,由于水底不平或水草、树根过多,挂钩失坠时有发生。因此在垂钓...
问下,图里的那个动漫人物是出自... 问下,图里的那个动漫人物是出自哪个动漫薄樱鬼斋藤一出自动漫《薄樱鬼》人物名为:斋藤一这是原图我觉得像...
死神黑崎一护是不是灭却师?第二... 死神黑崎一护是不是灭却师?第二部什么时候出?一护妈妈是灭却师,爸爸是死神,所以算个混血儿→ →也就是...
点到为止的意思 点到为止的意思点到为止:说话时只是轻轻触及话题的边缘,而不必深入谈论,但是已经让对方明了意图即可到了...
《余生请多指教》热播,顾医生身... 《余生请多指教》热播,顾医生身上有哪些特质?特别温柔,特别专一,会安慰人,会讲大道理,特别暖心。顾医...
浩态狂香昔未逢,红灯烁烁绿盘龙... 浩态狂香昔未逢,红灯烁烁绿盘龙,觉来独对情惊恐,身在仙宫第九重。韩愈的哪一首诗。名字啊什麼?顺便求诗...