完整研发流程中用到的环境类型和协作关系

编程学思 2021-10-29 13:13:52 ⋅ 1630 阅读

研发流程有多个不同的环节构成,一般分为开发、测试、验证和部署,这些环节需要不同的环境来支撑。对于企业来说,这些环境又需要互相配合来完成正常的研发部署工作,为了避免混乱的相互引用、提高协作的效率,界定环境之间的配合关系非常重要。


环境的类型

完整、可靠的研发流程涉及到五类不同的环境,从职责上划分类似下图:

不同环境的用途

其中,准生产环境和系统测试环境用虚线表示,是因为这两个环境不是必需的,在符合一定条件的时候创建这两个环境。


开发调试环境

开发调试环境是整个项目的地基,但不一定必须是“本地”的,一个原则是**“保证每个开发工程师能够有独立的、可运行的完整环境”**,这样能够有效避免代码的覆盖、相互间的干扰等导致的莫名其妙的问题。

一般来说,开发调试环境背后使用的数据库、缓存、共享存储等公共服务可以是共用的。相对来说,复制一份代码的成本是很低的,但是为每人都建立数据库、缓存、共享存储的成本较高,而且它们在开发过程中的调整并不频繁。


代码控制

即使只有一个人负责的项目,仍然强烈建议使用版本控制工具。它确实带来一些成本,但绝对物有所值,想象一下工作的移交、较为久远项目的再维护、决策依据的记录、决策对代码范围产生的影响等常见场景,使用版本控制工具能够快速有效的应对这些场景要求。

多人协作的项目对版本控制的依赖就更不用说了。

到这一层,研发人员直接控制代码部署的权限就没有了,后续三个环境的代码部署要完全依赖SCM系统。如果你的项目还没有实现这个目标,请立即想办法解决。


集成测试环境

在软件项目中,“集成”有多个不同的含义,这里特指代码的合并。

一般情况下,每个工程师产生的代码在提交到SCM时,理论上都是能够在自己的开发调试环境中正常运行了。但是多名工程师提交的代码在经过合并后,很有可能不能正常运行,比较常见的问题是配置文件的差异,这就需要一个集成测试环境进行验证。

集成测试环境验证通过后的代码才能提交到测试团队那里进行测试,所谓验证通过,是指没有低级的错误,比如数据库连不上,具体的标准需要测试和研发团队磨合、摸索和实践。

为了提高资源利用率,测试团队也在这个环境对开发团队提供的SCM代码版本进行测试。

请注意,在这个环境部署代码必须从SCM里获取,最好能有自动化的平台和工具,严格禁止绕开SCM的代码部署行为


系统测试环境

系统测试环境不是必需的。

当研发团队里有专门的测试成员时,有必要建立这个验证环境,不过在建立之前,可以考虑跟开发人员一起共用集成测试环境。当共用集成测试环境对研发工作带来较多不便时,可以考虑建立系统测试环境了。

这个环境是测试成员专属的,开发人员没有权限向该环境上传代码,而应该将代码通过SCM交给测试成员,比如使用专门的release分支。


准生产环境

集成测试环境里,开发人员掌控该环境的代码控制权限。系统测试环境里,测试人员掌控该环境的代码控制权限。从准生产环境开始,开发、测试团队将不能直接干预代码的部署工作,应该由专门的配置管理员完成。

准生产环境有四个至关重要的用途:

  1. 为其它系统的开发调试、集成测试环境提供相对稳定的接口服务
  2. 为功能验收提供相对完整的验证服务
  3. 为生产环境的数据变更提供验证服务
  4. 为生产环境的BUG重现提供支撑

这个环境的负责人应该是实施团队、配置管理团队。

准生产环境并不要每个系统都要建立一份,可以根据系统的规模、重要程度、敏感程度、稳定性要求酌情建设。

当系统的规模较大、重要程度高、敏感程度高、稳定性要求高时,准生产环境是非常适合建设的。相反,可以不用建设,环境越多,维护的成本越高,保证代码状态的控制手段越复杂。


预发布 | 生产环境

生产环境是控制最严格、稳定性要求最高的环节,这个环境只允许配置管理人员、基础设施人员具备管理权限和代码部署权限。

同时在该阶段,较大规模、相对重要的系统一般也需要一个“预发布”环境。

预发布环境

预发布环境是代码进入生产环境前的最后一个验证环节,它一般不参与生产环境的运行,但是拥有跟生产环境一致的代码状态。

这个环节的验证工作并不进行功能级别的验证,主要确保数据库联通性、接口可访问性等需要其它系统配合的关键节点。

生产环境

预发布环节验证通过后,就可以将预发布环境的代码镜像到每一台生产服务器了,具体镜像的方法,根据实际情况选用。但实在不建议逐台手动完成镜像。


不同环境间的协作关系

环境间的协作一般是指API或Service级别的对接,一般的规则是:

  1. 生产环境,不为任何非生产环境提供接口服务
  2. 准生产环境、集成测试环境,能且只能为其它系统的开发、集成、验证环境提供接口服务。
  3. 开发调试环境、系统测试环境,不应该为任何系统的任何环境提供接口服务。

生产环境,不为任何非生产环境提供接口服务

需要说明的是,在ESB已经就绪的情况下,接口服务要逐步迁移进来,以便管理和维护,否则很容出现系统关系的“蜘蛛网”结果。而且ESB还能提供专业的接口管理、质量监控等手段,保证接口的稳定性。

生产环境的接口不允许向其他系统的非生产环境提供接口服务,是为了避免开发、测试带来的干扰。


准生产环境,能且只能为其它系统的开发、测试环境提供接口服务

准生产提供相对稳定的接口服务,通过这一层向其他系统的开发环境、集成测试环境提供服务,能够提高对端系统的调试效率。

我经常看到,当在开发、集成环境向对端提供服务时,由于代码调整的频繁性,导致对端系统的调试屡出问题,可能刚刚还正常的功能,几分钟后就不正常了。而对端工程师一般不知道对接系统代码的发生了变更,会花费相当多的时间在自身找原因。

有时候,对端系统会要求对接系统保持稳定,但因此又影响了对接系统的开发进度,对接系统不得不小心翼翼地进行开发。

从图上可以看到,ESB准生产环境到开发、集成环境间有一个“单向”箭头,它的意思是说:ESB准生产不接入任何非准生产环境的接口。

前面说过,准生产环境的建立不是必要的,当一个系统没有必要创建准生产环境时,接口服务的提供只能让集成环境承担了。此时为什么不让验证环境承担呢?是因为验证环境仅面对测试人员,测试人员不具备调试接口的能力,开发人员又不具备该环境的权限。


开发环境、集成测试环境、系统测试环境间的关系

在整个流程中,开发环境是最不稳定的系统,所以不要考虑让这个环境为其他它任何环境提供接口服务。

上面提到,集成测试环境能够为其它系统的开发环境、集成、验证环境提供接口服务,基本上跟“准生产”环境一致了。不过这样做是为了兼容实际开发工作碰到的协同问题,是有条件的。

举个例子,系统A的升级开发要求系统B提供新的接口服务,B的这个接口显然需要通过A验证,甚至可能要和A系统同步上线。那么A系统的新开发接口是不具备部署到准生产环境的要求的,可是我们同时要求“开发调试环境,不应该为任何系统的任何环境提供接口服务”,以免互相干扰各自的开发进度,那么将这个接口部署到集成环境就是一个可行且相对稳定的方案了。

系统测试环境不向任何环境提供接口服务的理由在上一节已经提到过了。


部署流程

本文第一副图中标明了每个环境参与的主要角色和对应的代码分支,这些分支对应基于Git的Gitflow模型,下图标识了环境、分支、参与人员在完成代码上线工作的协作流程。


结论

从实际开发工作来看,上述几个环境基本能够解决多系统协同带来的问题,但是提高了维护成本。不过跟软件质量相比,还是非常有价值的。

而且,我们也可以根据自己的研发流程适当增减,但集成测试环境仍然建议必须具备。


全部评论: 0

    我有话说:

    Redis面试整理:Redis几种数据类型应用场景重新梳理了一下

    1、字符串 1.1 介绍 string 字符串类型是Redis最为常基础存储类型,是一个由字节组成序列,他在Redis是二进制安全,也可以认为string字符串数据类型能够接收任何格式

    为什么阿里巴巴不建议 boolean 类型变量 isXXX?

    背景 平时工作大家经常使用boolean以及Boolean类型数据,前者是基本数据类型,后者是包装类,为什么不推荐使用isXXX来命名呢?到底是基本类型数据好呢还是包装类好呢? 例子

    DDDplus 1.0.2 发布,轻量级业务台开发框架

    DDDplus 简介 一套轻量级业务台开发框架,以DDD思想为本,致力于业务资产可沉淀可传承,全方位解决复杂业务场景扩展问题,实现台核心要素,赋能台建设。 融合了前台复杂生态协作方法论

    数据生成工具 ZenData 发布 1.5 版本,新增 CSV Excel 输出格式,字段定义支持表达式

    随着DevOps日益流行,越来越多团队开始关注持续集成持续交付。在这种大背景下,自动化测试就越来越重要了。那么问题来了,如何能够实现大规模、工程化自动化测试呢?这里面会涉及诸多问题,比如

    CKEditor 5 v26.0.0 发布:具有可扩展构建、内联部件样式注释指南

    CKEditor 5 v26.0.0 已经发布,本次更新包括支持创建一个定制编辑器构建、Mac上按键管理、设计内联部件、编辑器占位符一组关于使用协作特性注释新指南等内容。 通过 DLL

    注解实现接口操作流水日志

    作者:Lvshen技术小屋  原文:https://www.toutiao.com/i689551231529549876 在项目,我们会需要获取接口操作日志。比如获取接口接口名

    项目为什么docker?

    前几天,公司一批服务器就要期了,由于服务器是15年购买,硬件性能远比现在新出云主机低,因此决定把所有服务器都换成新一代服务器,但是小编整准备动手迁移服务器时,内心一阵阵崩溃感涌上心头,仔细一

    Firebird 4.0 RC1 发布,C++ 开发关系数据库

    环境进行测试使用。 Firebird 4.0...

    项目为什么Docker?

      项目为什么要 docker,需要了解 docker 优势,结合项目实际情况来决定是否需要使用 docker,千万不能“为了使用而使用”或者“跟风使用 docker”。 使用

    前端实战篇—在Javascript,Number类型超长问题详解

    今天给大家分享是在Javascript,获取数字超出长度问题。

    开源分布式配置中心 Apollo 1.8.0 发布

    Apollo(阿波罗)是携程框架部门研发分布式配置心,能够集中化管理应用不同环境、不同集群配置,配置修改后能够实时推送应用端,并且具备规范权限、流程治理等特性,适用于微服务配置管理场景

    Gitflow工作流程

    不会使用多于特性分支流程使用概念或命令,它为...

    Python 基础系列--字符串类型【3】

    字符串是编程必然面临类型,常指数之高,不得不先了解下

    「轻阅读」轻松理解 Kubernetes 核心概念

    Kubernetes 迅速成为云环境软件部署管理新标准。

    从单体迈向Serverless避坑指南

    云原生应用有三个非常关键要素:微服务架构,应用容器化Serverless化,敏捷软件交付流程

    Spring Cloud(Greenwich版)-03-编写高可Eureka Server(集群)

    前言 上一章Spring Cloud(Greenwich版)-02-服务注册与服务发现-Eureka入门,我们实现了将UserGoods微服务都注册了Eureka上,那么在生产环境为了达到高

    京东家订单中心系统mysqles转化之路

    原文:https://www.toutiao.com/i6796507988602389006 京东家订单中心系统业务,无论是外部商家订单生产,或是内部上下游系统依赖,订单查询调用量都非常