前言

搭建基础平台搭建上篇的时候的时候,已经介绍过了项目流程设计、数据库搭建、jwt 登录等模块。

此篇我们介绍分支管理设计及其他的基础模块。

后端模块

  1. DevOps - Gitlab Api使用(已完成,点击跳转)
  2. DevOps - 搭建 DevOps 基础平台(已完成 50%)基础平台搭建上,点击跳转
  3. DevOps - Gitlab CI 流水线构建
  4. DevOps - Jenkins 流水线构建
  5. DevOps - Docker 使用
  6. DevOps - 发布任务流程设计
  7. DevOps - 代码审查卡点
  8. DevOps - Node 服务质量监控

后期可能会根据 DevOps 项目的实际开发进度对上述系列进行调整

Git 分支管理流程

Git Flow 流程


Production 分支

就是常用的 Master 分支,这个分支包含最近发布到生产环境的代码,最近发布的 Release, 这个分支只能从其他分支合并,不能在这个分支直接修改

Develop 分支

这个分支是的主开发分支,包含所有要发布到下一个Release的代码,这个主要合并于其他分支,比如 Feature 分支

Feature 分支

这个分支主要是用来开发一个新的功能,一旦开发完成,我们合并回 Develop 分支,并进入下一个 Release

Release 分支

当需要发布一个新 Release 的时候,基于 Develop 分支创建一个 Release 分支,完成 Release 后,合并到 Master 和 Develop 分支

Hotfix 分支

当在 Production 发现新的 Bu g时候,需要创建一个 Hotfix, 完成 Hotfix 后,合并回 Master 和 Develop 分支,所以 Hotfix 的改动会进入下一个 Release

整体的分支管理流程如下图所示


项目自建流程

上述的 Git Flow 流程使用可以规范约束开发质量跟流程,我们稍微修改一下部分流程,融入到项目中进行使用。



如图每个工程都共享一个 version 版本号,分支创建分为版本升级、特性更新、修订补丁三种模式,强制项目所有分支创建的命名规则都会升级,不会出现重复跟降级。


上述流程的优点

  1. 工程使用固定的版本锁死,版本对应需求流程,上线质量得到保障
  2. 每个开发分支都只能部署到测试环境,必须合并到合并到对应的版本分支之后才能上生产
  3. 所有合并到 master 或者 relase 分支会被删除,防止一条分支处理过多业务,后期 review、回滚难度提升
  4. realse 版本分支上线之后,生成对应 tag
  5. hotfix 版本可以从对应的 tag 拉出,可以明确的知道 hotfix 具体修复的是哪个版本的问题

上述流程的缺点

  1. 固化版本流程导致创建命名规则固定,且版本号不能升级只能降级
  2. 流程限制,降低开发灵活性

没有完美的解决方法,所有 devops 流程都要结合真实项目需求来设计,上述只是一种解决方案,有更通用的方案设计请加我微信 Cookieboty 探讨

DevOps 开发中篇

添加全局报错回调

没有绝对安全的程序,所有程序在运行中因各种情况会出现 error,全局错误回调是基础模块必要的。

export default class HttpExceptions extends Error { // 继承修改 error 类型  code: number;  msg: string;  httpCode: number;  constructor({ msg = "服务器异常", code = 1, httpCode = 400 }) {    super();    this.msg = msg;    this.code = code;    this.httpCode = httpCode;  }}import HttpExceptions from "../exceptions/http_exceptions"; // 全局拦截错误处理export default () => {  return async function errorHandler(ctx, next) {    try {      await next();    } catch (err) {      // 所有的异常都在 app 上触发一个 error 事件,框架会记录一条错误日志      ctx.app.emit("error", err, ctx);      let status = err.status || 500;      let error: any = {};      if (err instanceof HttpExceptions) {        status = err.httpCode;        error.requestUrl = `${ctx.method} : ${ctx.path}`;        error.msg = err.msg;        error.code = err.code;        error.httpCode = err.httpCode;      } else {        // 未知异常,系统异常,线上不显示堆栈信息        // 生产环境时 500 错误的详细错误内容不返回给客户端,因为可能包含敏感信息        error.code = 500;        error.errsInfo =          status === 500 && ctx.app.config.env === "prod"            ? "Internal Server Error"            : err.message;      }      // 从 error 对象上读出各个属性,设置到响应中      ctx.body = error;      if (status === 422) {        ctx.body.detail = err.errors;      }      ctx.status = status;    }  };};

如上,我们拓展默认错误类,添加错误中间件拦截全局异常,如果出现自定义异常抛出的时候,则处理全局异常,否则统一抛出 500 错误,去除敏感信息。

webSocket 使用

为什么要使用 webSocket

项目管理中,会涉及到同一个项目多人协作操作,而 ajax 轮训既消耗性能,实时性也不能完全保证,也会推送大量无效信息。所以项目采用 websocket 来推送多人协作信息以及后期构建流程的状态推送

egg-socket

框架提供了 egg-socket.io 插件,增加了以下开发规约:

  • namespace: 通过配置的方式定义 namespace(命名空间)
  • middleware: 对每一次 socket 连接的建立/断开、每一次消息/数据传递进行预处理
  • controller: 响应 socket.io 的 event 事件
  • router: 统一了 socket.io 的 event 与 框架路由的处理配置方式。

具体的使用方式请参考:egg-socket.io 使用,下面简单说下 ts 的配置

import { Application } from "egg"; // io路由使用方式import { EggShell } from "egg-shell-decorators";export default (app: Application) => {  const { router, controller, io } = app;  EggShell(app);  // socket.io  io.of('/').route('server', io.controller.nsp.ping);};

ts 使用中 io.controller.nsp 会报类型未定义,所以需要修改一下 typings/index.d.ts 文件。

import "egg";declare module "egg" {  interface Application { }  interface CustomController {    nsp: any;  }  interface EggSocketNameSpace {    emit: any  }}

socket.io-client

window.onload = function () {  // init  const socket = io('http://127.0.0.1:7001', {    // 实际使用中可以在这里传递参数    query: {      room: 'nsp',      userId: `client_${Math.random()}`,    },    transports: ['websocket'],  });  socket.on('connect', () => {    const id = socket.id;    log('#connect,', id, socket);    // 监听自身 id 以实现 p2p 通讯    socket.on(id, (msg: any) => {      log('#receive,', msg);    });  });  // 接收在线用户信息  socket.on('online', (msg: any) => {    log('#online,', msg);  });  // 系统事件  socket.on('disconnect', (msg: any) => {    log('#disconnect', msg);  });  socket.on('disconnecting', () => {    log('#disconnecting');  });  socket.on('error', () => {    log('#error');  });  window.socket = socket;};

客服端采用 socket.io-client 去链接 websocket。上述是基础链接部分,具体的实现要根据业务需求开发。

客服端实现

为了保障项目开发速度,客户端选择了 ANT DESIGN PRO。具体安装步骤请参考教程,这边展示一下部分业务端的代码。


JWT 前端使用

/** * 异常处理程序 */const errorHandler = (error: { response: Response }): Response => {  const { response } = error;  if (response && response.status) {    const errorText = codeMessage[response.status] || response.statusText;    const { status, url } = response;    if (response.status === 401) {      window.location.href = '/user/login';    }    notification.error({      message: `请求错误 ${status}: ${url}`,      description: errorText,    });  } else if (!response) {    notification.error({      description: '您的网络发生异常,无法连接服务器',      message: '网络异常',    });  }  return response;};/** * 配置request请求时的默认参数 */const request = extend({  prefix: '/api',  errorHandler, // 默认错误处理  credentials: 'include', // 默认请求是否带上cookie  headers: {    authorization: localStorage.getItem('authorization'), // 读取本地保存的 authorization token  },});export default request;

改造 request 模块

import request from '@/utils/request';export interface LoginParamsType {  username: string;  password: string;  mobile: string;  captcha: string;}export async function fakeAccountLogin(params: LoginParamsType) {  return request('/user/getUserToken', {    getResponse: true, // 开启可以拿到返回 header 参数,将对应的 authorization token 存入本地使用    method: 'POST',    data: { params },  });}

如上,拿到 response header 里面的 token,后续可以正常请求接口。

尾声

此项目是从零开发,后续此系列博客会根据实际开发进度推出(真 TMD 累),项目完成之后,会开放部分源码供各位同学参考。

如对文章内容有任何疑问、见解可添加微信 Cookieboty 沟通。

另外关注公众号 Cookieboty1024,欢迎加入前端小兵成长营

测试环境搭建流程_前端构建 DevOps 搭建 DevOps 基础平台(中)相关推荐

  1. sit是什么环境_测试环境是什么_搭建测试环境要遵循什么原则?

    测试环境是什么? 测试进行软件测试的之前,需要搭建好测试环境.那什么是测试环境呢? 简单的说就是软件运行的平台,即软件.硬件和网络三种环境的合集,也就是说:测试环境=软件+硬件+网络 硬件:包括PC机 ...

  2. 测试环境搭建流程_案例解析:一个完整的项目测试方案流程,应该是怎么的?...

    作为一名软件测试工程师,为项目制作完成的测试方案并执行,是我们日常工作的重要部分,同时,也是一名合格的软件测试工程师应有的专业素养.那么,很多小白和测试新手肯定要问了:一个完整的项目测试方案流程,应该 ...

  3. 测试环境搭建流程_软件测试流程

    一.测试主要的四个阶段 1.测试计划设计阶段:产品立项之后,进行需求分析,需求评审,业务需求评级,绘制业务流程图.确定测试负责人,开始制定测试计划: 2.测试准备阶段:各成员编写测试用例.先小组内评审 ...

  4. mysql搭建测试环境的步骤_如何搭建测试环境

    关于软件测试的测试环境搭建,需要根据实际的需求来进行安装特定的软件,下面就简单介绍下java+tomcat+mysql安装方法. 1.java的安装 因为很多程序的代码都是通过java编程语言进行编写 ...

  5. Kali Linux渗透测试实战 1.3 渗透测试的一般化流程_商洛学院司徒荆_新浪博客

    1.3 渗透测试的一般化流程 凡事预则立,不预则废,做任何事情都要有一个预先的计划.渗透测试作为测试学科的一个分支,早已形成了完整的方法论.在正式开始本书的实践教学章节之前,我也想谈一谈使用Kali ...

  6. dueros模拟测试没有请求后台_小度音箱对接之DuerOS开放平台功能分析

    由于项目需要,需要对接DuerOS,使用小度音箱控制设备.近期会对DuerOS技能平台进行一些研究,尤其是智能控制相关功能.特此记录. 文章目录 DuerOS开放平台简介 技能分类 自定义技能 小技能 ...

  7. 小学生体测测试环境怎么填_体质测试数据报送流程详解(收藏)

    完整的上报流程图 注:中小学学籍同步的学校不需要进行"年级班级管理"和"学生基本信息管理"操作. 一.账号登陆 1.打开浏览器搜索:"学生体质健康网& ...

  8. 开发转测试没人要_前端开发,测试,后端,该如何选择?

    一般来说前端会比后端简单一些的,初学者或者转行可能考虑前端多一点,但是后端开发的薪水又比前端高一些,就是比较枯燥. 前端开发 我目前一直在自学前端,从网上找资料,然后听课,只要是对编程有兴趣,应该都能 ...

  9. 小学生体测测试环境怎么填_学生体质健康学生来源填什么,小学生体质健康网...

    大学生学生体质健康测试学生来源是指籍贯所在地还... 选择好的学校要从以下几个方面考虑:仅供参考 1.办学时间长短,像办学时间长的院校,应该靠谱一点.. 2.办学规模,一定要有独立的校园环境, 3.教 ...

最新文章

  1. 高效读CV论文法则:先在GitHub上立Flag!| 资源
  2. 无线网卡实现AP 热点功能,共享Internet连接设置
  3. vmware虚拟机Ubuntu安装g++
  4. SpringBoot 使用AOP功能
  5. java 日志管理源码_Java源码初探_logging日志模块实现
  6. ideal新建springboot工程_MyBatis初级实战之一:Spring Boot集成
  7. linux下slow,慢查询日志的分析工具mysqlsla的使用
  8. html中ng-src,angular项目中,ie中iframe动态的ng-src,如果是路由的地址(带有#的url),页面不显示,googel却正常...
  9. js中的charAt,indexOf
  10. C++编程基础一 28-编程练习一
  11. python必须要记住的代码_好用到哭!请记住这20段Python代码
  12. 固态硬盘启动计算机时间,固态硬盘如何做到10秒快速开机
  13. 硕士毕业论文页眉页脚页码设置
  14. Azure部署的应用程序访问页面页面时加载字体文件(.woff.woff2)出现 404 错误问题
  15. 关于transition过渡的详解
  16. PMBOK(第六版) PMP笔记——《七》第七章(项目成本管理)
  17. RobotCraft 2019第四届机器人技术国际学院Robotics Craftsmanship International Academy(译)
  18. C语言删除链表的倒数第N个节点
  19. 2020考研如此激烈,还怕获得不了最新的调剂信息么?来对小木虫考研调剂信息爬取
  20. Software for Developing

热门文章

  1. 实时多线程系统的日志实现
  2. java 中的override overload 比较
  3. 深入解读首个万亿级语言模型 Switch Transformer
  4. 通过BAT、网易、京东产品经理的简历大概什么样?
  5. 宁夏警官学院计算机专业,宁夏警官职业学院毕业设计模板.docx
  6. 关于SP一些响应码的API返回码及解析集合
  7. 边缘计算如何实现海量IoT数据就地处理
  8. 2020年末总结,脚踏实地,一步一个脚印——致敬自己一年的心酸历程
  9. 程序员应该如何提问?
  10. 如何查看mysql的gtid_汇总丨MySQL GTID技术点,看这一篇就够了!