每个开发都应该了解的自动化构建DevOps:多测试环境(spug)

前言

开始之前,先引用一下DevOps的官方解释,不清楚的读者可以在心里有个简单的概念

DevOps维基百科定义 DevOps(Development和Operations的组合词)是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠

好,按照惯例,本文还是按照这样的顺序展开:现状是什么->现状有什么问题->如何解决->有哪些方案->方案对比->方案实现细节。闲言少叙,直接进入正题

现状是什么

先说环境:

从前后端的开发到上线,不同的企业对不同的环境有不同的命名,甚至有更精细的划分。但是一般可以可以划分为三个环境,我把这三个环境命名如下

  1. local:本地环境,把项目 git clone 到自己的工作笔记本或者开发机中,在 localhost:8080 类似的地址进行调试与开发。此时环境的面向对象主要是开发者。
  2. dev:测试环境,本地业务迭代开发结束并交付给测试进行功能测试的环境,在 dev.company.com 类似的二级域名进行测试。此时环境的面向对象主要是测试人员。(就一个测试域名环境)
  3. prod:生产环境,线上供用户使用的环境,在company.com 类似的地址。此时环境的面向对象主要是用户。
再说开发流程:
  1. feature 分支对应本地环境
  2. develop 分支对应测试环境
  3. master 分支对应生产环境

目前部门的前端项目基于jenkins来实现的cicd,如想了解Jenkins使用和原理的可以移步到之前的这篇文章,开发者开发完之后提交mergeRequest到develop分支,触发Jenkins的自动构建流程,自动部署到测试环境,这个时候,测试老师就可以执行测试用例了,至于上线,操作则类似,只需要把测试通过的develop分支代码合并到master,然后master打tag,在jenkins上选择tag,接着触发自动部署到线上环境的任务,就完成了整个闭环的上线流程,如果要回滚,就直接选择上一个版本的tag,重新构建一下就可以了

(备注:选tag构建上线,需要用到jenkins插件Build With Parameters Plugin)

现状有什么问题

基于上面的现状,看似没有问题,也没错,如果对于小团队,迭代不多的业务完全没有问题,但是,如果不是呢,问题就慢慢暴露出来了,比如:

  1. 当多功能同时开发时会造成 develop 分支的拥挤,导致各个功能最后只能统一上线,因为它无法时刻保持一个干净的 develop 分支,这与我们现在所提倡的敏捷开发,小步迭代格格不入。(最重要的问题)
  2. 当 develop 分支测试出现 bug 后,每次修复后都需要合并到 develop 分支再走测试流程,最主要是的是:就算测试完了,如果此时develop分支有其他正在测试功能,就无法直接将devlop分支合到master上线
  3. 多功能同时开发,都在提交代码到测试环境,容易互相影响,比如我正在开发功能a,正在测试阶段,另外一个人也提交代码到测试环境,但是出错了,这个时候,我对应的测试老师就会找我

上面3点其实说白了就1个:单测试分支和测试环境无法满足多功能同时开发,但不同时上线的要求

此时,基于 feature 分支急需一套可单独测试的环境 关于上线还有一个重要的问题:就是回滚操作,不难发现,目前的回滚操作是需要选择上一个版本的tag,重新选择构建才能生效的,按照目前前端项目的构建时间,构建时间快则30s,慢则不好说,如果真的上线出了问题,想要回滚,在这段构建时间里,啥也干不了,只能摸摸自己的头发了

src=http___nimg.ws.126.net__url=http___dingyue.ws.126.net_2021_0602_402f77d6j00qu249w000gd200b400avg00b400av.jpg&thumbnail=650x2147483647&quality=80&type=jpg&refer=http___nimg.ws.126.jpeg

其实:无论大中小企业,多分支的前端测试环境基本上已成为了标配,即每一个功能分支都配有相应的测试环境。

如何解决(知原理)

针对第一类问题,目的其实很简单,就是需要在目前的构建基础上,支持多分支测试环境,也就是说目前是这样:

提侧分支 develop:测试环境 dev.company.com

要改成这样:

  • 提侧分支featureA测试环境 featureA.dev.company.com
  • 提侧分支featureB测试环境 featureB.dev.company.com
  • 提侧分支feature测试环境 feature.dev.company.com

这样不同功能迭代就可以按照自己的节奏跑了,怎么实现呢

拿一台服务器来说明一下:

首先将不同分支的构建结果放到分支名字对应的文件夹里, 假如放到这里:/var/www/html/project/featureA 其次最主要的就是nginx 做一个泛域名解析就行了, 大概如下:

image.png

这样按理说你就应该可以通过类似featureA.project1.company.com 的域名访问不同的测试分支了

针对第二个问题,目的就更简单了,就是在回滚的时候,不要执行构建,要立马能实现回滚,怎么办?聪明的你一定想到了,保留一份不就好了,如果想要回滚上上个版本,那就保留前面的2次构建结果,当然 这里面得先制定一个文件夹名字规则,不然怎么知道回滚哪个版本,举例 可以简单按照下面

image.png

每一个项目对应一个id,这个vue_test 项目的id 是2,后面的是发布记录,最后面是发布时间戳,数据库记录一下当前项目的版本,回滚,就找上一个版本的文件夹,然后替换掉目前的服务目录就可以了

备注:上面的目录结构没有考虑到多分枝,所以其实文件夹名字里面还应该有分枝对应的标志区分,比如2_featurea_3_20211122

有哪些方案

好,有了思路以后,是不是立马开干了?no! no! no!,做成了,会有人说又一个kpi项目,又一个轮子,做不成,就更不好解释了,哈哈。首先 肯定是要疯狂的搜索一下是否有现成的解决方案,结果不出所料,还真有不少,Spug、codo、bigops、walle等,而且有的还提供了项目间的依赖关系,比如,项目A依赖项目b、项目c,如果上线项目A的话,得先上线项目B和项目C,之前都是人工记忆,难免出差错,有了这个依赖关系后,只需要关注最上面的项目就可以了,简直完美

f636afc379310a555defed7bb14543a983261071.jpeg

各个方案对比

在此不在赘述,网上一大堆,可自行搜索,选择适合自己目前公司业务的方案即可,作者站在不求最好,但求最适合的角度考虑下,选了spug

方案实现细节

spug项目提供两种运行方式,一个是代码运行,一个是docker容器运行,官方提供的容器镜像没有node环境,所以对前端项目来说不太友好,我自己新建上传到 docker hub,有需要可以直接使用delonglimin/spug

既然选择了spug,如果对他的实现方式都不了解,出了问题,还不得自己兜着,所以,必须得先把这项目关键技术路径熟悉清楚,出了bug或者需求得能支持才行,接下来就拿其中几个重要技术点做一下研究说明 先来一张spug的整体业务流转图(其实绝大部分的devops都类似)

spug流程.png 下面这张图主要解释前端如何通过xterm显示构建状态并且如何操作服务端(也就是传说中的webshell) image.png

其他:

  1. 整个业务流转依赖ssh协议,也就是平常说的免密操作
  2. 项目涉及到三个易混概念,可自行搜索解读:Asgi、Wsgi、cgi

猜你喜欢

转载自juejin.im/post/7036240637657776158