測試環境搭建流程_前端構建 DevOps 搭建 DevOps 基礎平臺(中)

前言

搭建基礎平臺搭建上篇的時候的時候,已經介紹過了項目流程設計、數據庫搭建、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 流程

502d64096091d2cde9278e96bc439ff1.png

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

整體的分支管理流程如下圖所示

31c70a3b7a3d258b383bd29f1122e159.png

項目自建流程

上述的 Git Flow 流程使用可以規范約束開發質量跟流程,我們稍微修改一下部分流程,融入到項目中進行使用。

5abf6e581780bfdb37dd5edfcfd1c69f.png
699e7f0c58823d99fc780cd064e517e8.png

如圖每個工程都共享一個 version 版本號,分支創建分為版本升級、特性更新、修訂補丁三種模式,強制項目所有分支創建的命名規則都會升級,不會出現重復跟降級。

83e9cd112f943d276df110ec2a70ac8e.png

上述流程的優點

  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。具體安裝步驟請參考教程,這邊展示一下部分業務端的代碼。

f017eb76d938a5bcc40615d9158604d1.png

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,歡迎加入前端小兵成長營

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370779.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370779.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370779.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

什么是PermGen泄漏?

接下來是對Java應用程序中特定類型的內存問題的實用介紹。 即–我們將分析導致java.lang.OutOfMemoryError:PermGen空間的錯誤 堆棧跟蹤中的癥狀。 首先,我們將介紹理解該主題所需的核心概念,并說明什么是對象,類,類…

html浮動炫酷樣式,jQuery和CSS3炫酷表單浮動標簽特效

這是一款炫酷的jQuery和CSS3表單浮動標簽特效。浮動標簽是指輸入框中的文字或占位文本在輸入框聚焦的時候,以動畫的方式浮動到指定的地方。浮動標簽特效是一種新穎時尚的動畫特效,不僅效果很酷,而且能以明確的方式提示用戶該輸入框應該填寫上…

rto凈化效率計算公式_全面剖析 石油化工行業RTO蓄熱式焚燒爐的優勢要素

在我國的國民經濟發展中,石油化工產業是重要的能源基礎工業,但是廢氣的治理問題一直困擾著許多企業。直到RTO蓄熱式焚燒爐的面世,為石油化工行業的廢氣治理帶來了新希望。如今,有機廢氣治理工作越來越受到廣泛重視,傳統…

python作業:高級FTP程序

要求: 用戶加密認證允許同時多用戶登錄每個用戶有自己的家目錄 ,且只能訪問自己的家目錄對用戶進行磁盤配額,每個用戶的可用空間不同允許用戶在ftp server上隨意切換目錄允許用戶查看當前目錄下文件允許上傳和下載文件,保證文件一…

webpack學習筆記 (一)

一、安裝nodejs; 點擊打開nodejs官方站點; 點擊下圖框住的按鈕,下周nodejs安裝包; 安裝下載好的安裝包。 安裝完畢之后,在cmd中輸入node -v查看是否已經安裝成功 如果有版本號顯示,則代表安裝成功&#xf…

將渦輪增壓器添加到JEE Apps

我扮演的關鍵角色之一是在本地社區中傳播Akka。 作為討論的一部分,人們通常會想到的問題/疑問是Akka如何針對編寫良好的Java / JEE應用程序提供更好的可伸縮性和并發性。 由于底層硬件/ JVM保持不變,因此參與者模型如何比傳統的JEE應用程序發揮更多的功…

python package_python之package定義

一.簡單說明 python是通過module組織代碼的,每一個module就是一個python文件,但是modules是通過package來組織的。我們平時在簡單測試的時候 一般就是幾個Python文件存放在同級的目錄下,但是當我們開始嘗試開發更為復雜的項目時,p…

html 手機端無法拖動地圖,關于騰訊地圖api的禁止地圖拖動問題

禁用滾動和拖動*{margin:0px;padding:0px;}body, button, input, select, textarea {font: 12px/16px Verdana, Helvetica, Arial, sans-serif;}p{width:603px;padding-top:3px;overflow:hidden;}.btn{width:142px;}#container{min-width:600px;min-height:767px;}//初始化函數…

《一起》個人進展——Day07

昨天做了些什么:實現登錄界面的美化 今天的計劃:還是準備進行與其他界面的融合 遇到的困難:代碼了解不夠,融合起來會出現bug轉載于:https://www.cnblogs.com/gxt-/p/6828131.html

epoll nio區別_【總結】兩種 NIO 實現:Selector 與 Epoll

我想用這個話題小結下最近這一階段的各種測試和開發。其實文章的內容主要還是想總結一下NIO Socket,以及兩種不同操作系統實現NIO的方式,selector和epoll。問題應該從服務器端開始說起。我們都寫過net包下的socket,用socket的accept方法來等待…

MapReduce的工作原理

一、MapReduce模型框架 MapReduce是一個用于大規模數據處理的分布式計算模型,最初由Google工程師設計并實現的,Google已經將完整的MapReduce論文公開發布了。其中的定義是,MapReduce是一個編程模型,是一個用于處理和生成大規模數據…

react實現多行文本超出加省略號

http://www.css88.com/archives/5206 overflow : hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; 根據該文章方法,放在react項目中發現并不能實現,仔細觀察發現原來react解析出來的css樣…

Google Guava MultiMaps

番石榴 這是系列文章中的第一篇,我將嘗試解釋和探索Google很棒的Guava java庫 。 我在搜索Apache Commons Collections的通用版本時遇到了番石榴(Guava)–我需要一個Bimap并且厭倦了必須使用強制類型轉換來填充我的代碼–但是我發現要好得多…

qq群 html,我的群組-普通群組.html

我的群組-普通群組$axure.utils.getTransparentGifPath function() { return resources/images/transparent.gif; };$axure.utils.getOtherPath function() { return resources/Other.html; };$axure.utils.getReloadPath function() { return resou…

查看PLC IP 端口_西門子828D數控系統X130接口通訊怪異現象(X130手動設置的 IP)...

西門子828D數控系統,調試PLC過程中遇到網絡通信怪異問題(不能直連非要加個路由器),筆記本電腦的以太網網絡直接連接顯示網絡電纜被拔出,如下圖所示:奇怪,怎么出現這種情況了呢,因為我用這臺電腦調試過別的P…

基于嵌入式系統的gnash最小庫依賴關系

已經對gnash的依賴庫作了詳細的分析,下邊是必須依賴的庫:GIF Required libungif-devlibxml2 Required libxml2-devPNG Requir…

git 創建webpack項目_一次create-react-app創建項目升級webpack的流水賬

不再贅述為什么要升級webpack4,有興趣的小伙伴可以看一下 知乎:如何評價webpack4下面擼起袖子開干:克隆項目,新建分支git checkout -b feature_webpack_upgrade# 相當于以下兩句的簡寫git branch feature_webpack_upgradegit chec…

bzoj1263

貪心 n%31 分出一個4&#xff0c;其余用3&#xff0c;n%32&#xff0c;分出一個2&#xff0c;其余用3&#xff0c;然后高精度就行了 #include<bits/stdc.h> using namespace std; const int N 5005; struct BigInt {int len;int a[N];BigInt() { memset(a, 0, sizeof(a)…

c語言volatile_[技術]為什么單片機C語言編程時某一變量有時亂碼

最近一個項目里面&#xff0c;在KEIL中用C語言在單片機里面定義了一個狀態機全局變量&#xff0c;這個變量隨時會改變&#xff0c;用于切換觸摸屏的界面&#xff0c;可是程序運行中出現了一個問題&#xff0c;這個狀態機號總是出現了被莫名奇妙改變的問題&#xff0c;導致觸屏不…

沙箱Java代碼

在上一篇文章中&#xff0c;我們研究了如何保護移動Java代碼 。 這樣做的一種選擇是在籠子或沙箱中運行代碼。 這篇文章探討了如何為Java應用程序設置這樣的沙箱。 安全經理 Java中支持沙箱的安全性設施是java.lang.SecurityManager 。 默認情況下&#xff0c;Java在沒有Se…