研发环境那些事

前言

作为工程师,研发环境是日常研发工作必不可少的一个环节。什么是研发环境?我理解的研发环境,是除了生产环境(也有人叫线上环境,现网环境等)外的作为研发日常工作的环境。最常用的环境有3类:开发环境、测试环境、预发布环境。为了保证线上环境的稳定性,你可不想一不小心,就搞挂了生产环境,我们会隔离线上环境,独立出来对应的开发、测试、预发布等研发环境。

开发环境

开发环境是开发的日常开发工作都在这个环境进行。大部分的基础开发工作都会在该环境进行,你可以在本地搭建开发环境,也可以在本地开发完后,同步代码到服务器远程开发。

测试环境

所谓的测试环境,主要用于测试验证当前的需求开发是否符合预期。开发工程师完成需求开发后,将更新同步该环境,测试工程师进行需求验证。

预发布环境

所谓的预发布环境,其实就是真实的线上环境,几乎全部的环境配置都是一模一样的,包括但不限于,操作系统版本以及软件配置,开发语言的运行环境,数据库配置等。
最后上线前的验证环境,除了不对用户开放外,这个环境的数据和线上是一致的。产品、运营、测试、开发都可以尝试做最后的线上验证,提前发现问题。

环境对比

分类 使用场景 使用者 使用时机 备注
开发环境 日常开发 开发工程师 需求开发
测试环境 测试验证 开发、测试工程师 开发完成
预发布环境 线上验证 开发、测试、产品、运营等 上线之前

环境切换

将研发环境分为3类后,就会有切换的需求。一个需求从开发到上线,会涉及到开发->测试->预发布等步骤,对应的环境也需要进行变更。

最简单的方法是直接配置Host。我们都知道,计算机能识别的只有IP地址,IP地址由数字组成,而人类对数字的记忆,确实不在行。所以有了DNS系统,其核心是将对应的域名转换为IP地址。这样人类不用记忆复杂的数字,计算机也能正确得到IP地址。通常情况下,Windows和Linux 都可以直接修改hosts配置文件,前面是IP地址加一个空格,后面是域名地址。

常见的工具有SwitchHost,chrome插件Awesome Host Manager等。

也可以手动修改Host文件:

// Windows 需要管路员权限
C:\WINDOWS\system32\drivers\etc\hosts
// linux
/etc/hosts
// 配置示例
127.0.0.1       localhost

在我的大部分工作期间,也是这样过来的。配置Hosts文件的问题在于:

  1. 每次提测需求后,都需要邮件通知到测试相关人员,配置对应的Host。
  2. 有时候每次的地址还都不一样,更不用说无法解决移动端测试问题,手机测试移动网页是无法配置Host的。除非手机越狱或者有root的权限,进行一番复杂的操作才能配置Host。
  3. 随着开发人员的增多,可能会出现测试域名冲突,甚至还需要有api1.xbc.me、api2.xbc.me这样的域名存在。

在更复杂的网络环境,比如上网需要代理的情况,根本无法预知配置的Host是否生效的问题。所以,有没有简单一点办法?这类环境问题经常遇到,解决的办法还是有的。

多环境解析

我们是这样解决这个问题的。

首先,采用三级域名来区分不同环境的域名,比如测试环境和预发布环境的域名为:www.dev.xbc.me、www.test.xbc.me

其次,采用四级域名来区分不同的业务和访问客户端。

最后,我们预留了5级域名区分多个版本的情况。

以域名www.dev.xbc.me为例:

www对应的终端业务标识,这里代表了Web App,也就是我们常使用的台式机,使用Web浏览器访问网页。

dev对应是环境标识,一般有dev、test、pre等。

xbc.me对应是业务域名。

这里,我用一张表格来说明。

分类 终端/业务 对应域名 备注
开发环境 www www.dev.xbc.me PC端
app app.dev.xbc.me App接口
m m.dev.xbc.me 手机端
测试环境 www www.test.xbc.me PC端
app app.test.xbc.me App接口
m m.test.xbc.me 手机端

对应的Nginx配置如下:

server{
  listen      80;
  server_name ~^(?<version>.+)\.www\.(dev|test|pre)\.xbc\.me$;
  root        /var/www/vhosts/$version/public;
  location ~ \.php$ {
        ...
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param  PATH_INFO          $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED    $document_root$fastcgi_path_info;
        fastcgi_param  APP_ENV            'test'; # prd|pre|test|dev
        fastcgi_param  APP_VERSION        $version;
        include        fastcgi_params;
}
}
  1. server_name 采用正则去解析对应的域名,如:my.www.dev.xbc.me等。解析为my版本号,www为PC端,dev为开发环境。
  2. 添加环境和版本的常量 fastcgi_param APP_ENV APP_VERSION。
  3. 代码里定义相关环境常量。进行判断isset($_SERVER['APP_ENV']) isset($_SERVER['APP_VERSION'])

相关代码如下:

<?php
    // 常量为PRD/PRE/TEST/DEV
    if (isset($_SERVER['APP_ENV'])) {
      defined($env = strtoupper($_SERVER['APP_ENV'])) or define($env, true);
      unset($env, $_SERVER['APP_ENV']);
    }
    // 检查版本常量APP_VERSION是否定义,没有定义的话去默认值 "default"
    defined('APP_VERSION') or define('APP_VERSION', isset($_SERVER['APP_VERSION']) ? $_SERVER['APP_VERSION'] : 'default');

总结

文章总结日常开发中遇到的3类环境以及多环境的使用场景。

其中分析了配置Host的办法切换环境的优缺点,进而提出采用多级域名解决多人协作的环境问题。

但在云时代的现在,我们还需要这么多的环境吗?有没有办法解决多个环境搭建的难题呢?我觉得Docker可能是保证多个基础环境保证一致的有效技术手段,但如何将Docker技术应用起来又是另外一个话题了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注