代碼質量檢測平臺架構設計

「前言」

你是否清楚的瞭解本身的項目有多少個文件夾、多少個文件、多少行代碼、多少個函數、多少個字符數?
你是否在項目中引入過代碼質量檢測相關的工具?
你是否在不一樣項目的切換中飽受indent=2仍是indent=4的困擾?
你是否懷疑過本身的代碼存在性能問題和內存泄露?
趕快和我一塊兒來學習如何搭建一套持續集成的代碼質量檢測平臺,爲平常項目開發「保駕護航」吧~node

背景

  • 咱們團隊有多條業務線,每條業務線都有不少子業務項目,每一個業務項目使用的技術棧都各不相同,天天有不少業務迭代需求,每次提交的merge request都須要相關同事完成code review以後才能夠 merge 代碼,這更是增長大量的人力成本。
  • 不一樣業務框架使用不一樣的技術棧,不一樣技術棧引入不一樣的coding style,這更是致使開發者在開發過程當中沒法適從,無統一的標準,致使編程風格混亂。
  • 有些開發者因爲迭代需求多或者臨時bug修復等緣由直接跳過代碼質量檢查,上線後因爲粗枝大葉產生一些低級bug致使線上故障。
  • 簡單的code review只能解決代碼風格問題,而很難發現重複度、複雜度,case經過率等方面的問題。

預期

對於在平常開發中遇到的這些問題,咱們指望能有這樣一套系統,它可以幫助咱們解決如下問題:linux

  • 可視: 咱們但願這個系統可以方便、直觀的查看到代碼存在的問題;
  • 統一規範:不一樣的項目運用統一的代碼檢測規則,方便團隊進行多項目管理,下降開發者上手成本;
  • 規範且定量:創建一套對檢測結果通用的評分標準,方便咱們定量的瞭解項目代碼健康度;
  • 多維度全方位:提供多維度代碼檢測工具;
  • 優化建議:代碼質量檢查後提供相關優化建議;

項目功能點實現

  • 持續集成:經過code Merge Request持續觸發檢測;
  • 配置中心化:統一的配置管理,包括檢測任務,檢測須要用到的規則;
  • 多維度:開始咱們加入 code lint 和代碼重複率檢查;
  • 可視化:web頁面查看項目的檢測評分與各子項詳細檢測結果;
  • 評價體系:創建符合實際需求的評價標準體系;

總體架構

總體架構圖
總體架構圖

項目主要經過提交 Merge Request 觸發 git hook,該請求發送merge相關數據至中間層 Node Server,Node 層將請求透傳到 Jenkins Server, Jenkins Server 啓動Job並執行相關檢測腳本,任務完成callback通知 Node Servergit 倉庫完成相關‘解鎖’步驟。git

使用的技術棧

而在該項目中,咱們使用的技術棧包括:web

  • Nuxt + koa + WebSocket
  • Apollo + GraphQL
  • Jenkins + Plugin
  • Shell + Python

這篇文章定位是項目總體介紹,故而不涉及具體實現細節,後續咱們會有系列文章和你們一塊兒分享功能實現中遇到的問題。npm

Jenkins Server架構

Jenkins Server架構圖
Jenkins Server架構圖

Jenkins Server根據收到的請求調起對應 Job, 在對應 Job執行完成後觸發回調,通知開發者、 Node Server中間層任務已經結束。
Jenkins是一個比較成熟,廣泛用於持續集成框架,它經過安裝插件即可支持各類任務模式。
在該這個項目中,咱們本身開發 plugin 完成參數統一化和回調觸發。

腳本框架

原始結果產出
原始結果產出

咱們將 jenkins須要執行的腳本放在一個代碼倉庫中管理,而jenkins job只負責拉取腳本代碼,並執行入口文件。

import os
import sys

gitRemote = 'ssh://git@***********.com/litmus.git'

# 拉取代碼倉庫, 切換cwd爲腳本目錄
if os.path.isdir('litmus'):
  os.chdir('litmus')
  os.system('git fetch origin && git reset --hard origin/master')
else:
  os.system('git clone %s --depth=1' % gitRemote)
  os.chdir('litmus')
# 安裝依賴,執行入口文件
os.system('npm install')
sys.path.append('entry')
import web

result = web.main(None, None)複製代碼

咱們的腳本執行結果都是以文件的形式產出,而這套文件產出結果將會成爲咱們提供web頁面展現的原始數據輸入。編程

Node Web端架構

Node Web端架構實現
Node Web端架構實現

2016 年 10 月 25 日,zeit.co 背後的團隊對外發布了 Next.js,一個 React 的服務端渲染應用框架。幾小時後,與 Next.js 殊途同歸,一個基於 Vue.js 的服務端渲染應用框架應運而生,咱們稱之爲:Nuxt.jsbash

Web端頁面展現
Web端頁面展現

咱們經過該web框架展現目標項目執行結果。

總結

本文主要講解「代碼質量檢測平臺」項目從需求收集、提取、架構設計以及最終的實現。
這套架構體系對咱們的開發者提出了較高的要求,在業務項目接入中,咱們遇到了不少困難:架構

  • 如何制定統一規則
  • 如何本地化腳本任務
  • 如何將graphql集成到nuxt中
  • 如何控制單個項目對jenkins任務的重複觸發
  • 如何解決腳本+web致使的linux文件打開數上線問題
  • 如何在多端同步jenkins任務狀態

想要更多的瞭解咱們是如何解決這些難題的, 請點擊下方「❤️」,並關注咱們吧。
咱們會有系列文章來和你們一塊兒分享咱們與「代碼質量檢測平臺」的故事。app

做者簡介: J文,15年加入「美團點評」,目前就任於 點評點餐終端團隊,咱們期待您與咱們一塊兒打造將來的「智能餐廳」。框架

相關文章
相關標籤/搜索