前端应用在体积变大以后,编译时间会变得越来越长,特别是在机器性能不强的测试环境,构建时间更长,如果需求迭代频繁,测试环境还会出现资源不足的情况,如何借助docker来缓解这种情况呢?

场景

测试环境在部署前端应用时资源不足,且编译时间过长 由于测试环境机器性能不足,导致大型的vue前端应用,测试环境编译时间达到了2,3十分钟,如果机器空闲计算资源不多,会更加缓慢,在测试环境硬件投入有限的情况下,需要从软件层面改善这种情况。

方案

借助开发机资源

测试环境部署主要的消耗在编译这一步,如果测试环境硬件资源有限,那么可以借助开发机的资源,而且开发机的性能强于测试机,因此在硬件资源压力较大的情况下,可以借用开发机的资源来编译

docker V.S 本机

借助开发机编译,不能影响开发机的上正常的开发工作,所以有两种方案 一是利用docker跑一个node的编译环境 另外一种就是在本机上建立一个专门的工作目录,用来拉项目代码进行编译。 方案一的优势是docker可以启动多个容器,管理起来更加方便,而方案二基于本机,启动多个编译环境,管理起来比较复杂。 方案二的优势是,直接使用本机的资源,相比docker内编译,性能更高。 为了便于管理,选择了docker的方案

实现

架构

UntitledDiagram

  • master管理台通过socket与各个agent连接
  • docker镜像启动的同时会启动agent服务,启动成功后通知master,并注册在可用机器列表中
  • 镜像启动时需传入项目git路径的环境变量,以便拉取项目代码
  • agent需要定时发送心跳,报告空闲状态

docker镜像

FROM centos

LABEL maintainer="[email protected]"
ENV GITREPO
RUN yum update -y
RUN yum install openssl openssh-server rsync -y
RUN ssh-keygen -t rsa -N '' -f /etc/ssh/ssh_host_rsa_key -q && ssh-keygen -t ecdsa -N '' -f /etc/ssh/ssh_host_ecdsa_key -q && ssh-keygen -t ed25519 -N '' -f /etc/ssh/ssh_host_ed25519_key -q
RUN sed -i "s/UsePAM.*/UsePAM no/g" /etc/ssh/sshd_config
RUN echo "root:123456" | chpasswd
RUN yum install -y gcc-c++ make
RUN curl -sL https://rpm.nodesource.com/setup_8.x | bash -
RUN yum install nodejs -y
WORKDIR /project
COPY ./agent /project/agent
VOLUME /project/src
ENTRYPOINT ["sh", "/project/agent/start.sh"]
EXPOSE 22
  • 构建后需要将打包文件传输至部署机器,并启动服务,因此需要安装ssh服务
  • entrypoint启动agent服务
  • env环境变量传入项目git地址

agent

  • 启动后上报socket的ID用于标示,并上报空余资源和硬件信息和项目配置
  • 监听master传来的动作信息,切换分支,执行编译部署
  • 编译完成后,打包dist目录,拷贝到部署机器,然后ssh登陆到部署机执行部署脚本
  • 编译过程需要上报输出至master

master

  • 启动后监听agent,并给出agent列表,标记agent空闲状态
  • 支持部署机管理,保存部署机IP和ssh密码
  • 选择agent编译时,需要将部署机信息传给agent
  • 接入gitlab-api,根据选择的项目获取分支列表,编译时将分支作为参数给agent

日志

为了方便排查问题,需要将部署过程的日志保存下来,由于日志不需要持久化,选用redis存储即可

密钥安全问题

如果局域网不考虑部署机的密钥安全问题,可明文传输即可 如果需要考虑安全问题,需使用非对称加密传输密钥。 agent启动时,生成公钥,并将公钥传给master,选择agent编译,用公钥加密密钥传给agent。