动态

详情 返回 返回

從零實現模塊級代碼影響面分析方案|得物技術 - 动态 详情

一、名詞解釋

代碼影響面(Code Impact Analysis)

是指在代碼變更後,分析這些變更對系統中其他部分的影響範圍。它幫助開發團隊理解代碼修改的潛在影響,從而減少意外問題並提高代碼質量。

模塊級

是指以模塊(Module)為單位的代碼組織、分析和管理的粒度。模塊是代碼的基本單元,通常包含一組相關的功能,可以是 JavaScript 文件、UI 組件、頁面或其他功能單元。

二、背景 & 價值

在過往交易域穩定性建設中,我們完成了多項關鍵工作,包括後台應用拆分、歷史債務重構、權限配置管控和核心H5頁面定期巡檢任務等。此外,我們還整合了前端監控平台的各類異常數據分析與告警能力,幫助提前發現系統性風險,以提升系統的整體穩定性。

通過對於以往故障案例的覆盤,我們也識別出一些導致系統穩定性問題的潛在隱患,尤其是隨着業務複雜度提升,單個版本往往涉及大量頁面改動和複雜的依賴關係。現有的影響面評估方式難以全面覆蓋這些變更,在這種情況下容易導致出現生產問題時止血時間的拉長,影響了系統的穩定性和用户體驗。

在迭代發佈視角下,代碼影響面的分析尤為重要。每次迭代發佈通常涉及多個功能或模塊的更新,而這些更新可能會對系統的其他部分產生直接或間接的影響。

問題梳理

風險評估滯後

依賴人工經驗判斷改動影響面,在涉及多人協作和多個模塊的團隊開發或Monorepo等複雜場景下尤其低效。

信息維度割裂

現有研發協同平台以需求為緯度聚合研發相關信息,而前端穩定性保障則更需要以頁面為緯度聚合迭代相關信息。

變更追蹤困難

關鍵變更信息散落在羣聊或各個系統中,缺乏一個統一的平台來聚合這些信息,導致信息同步和協作效率低下。

因此,我們希望實現一套自動化收集模塊級代碼影響面分析的方案,並以此評估版本需求發佈對於系統整體穩定性的影響,從而提前確保重點模塊能夠得到有效的預警和監控,並創建相應的預案計劃。

價值收益

研發自測能力提升

能夠更精準地識別更改影響的頁面或模塊,確保需求影響範圍符合預期。

測試覆蓋率優化

結合變更影響,確保關鍵路徑的完整測試,提升測試的有效性和覆蓋率。

評估系統複雜度

有助於全面評估版本發佈影響面範圍;對系統各業務模塊進行合理資源分配。

三、技術方案

代碼影響面分析的完整方案分為多個關鍵步驟,通過這些步驟可以實現自動化收集模塊級代碼影響面分析,並評估版本需求發佈對系統整體穩定性的影響。

具體可以參考下面的流程圖瞭解👇:

詳細設計

影響面分析引擎

通過結合代碼變更、依賴關係、業務邏輯等多維度數據,幫助開發團隊快速識別和評估代碼修改的潛在影響,從而減少生產問題的發生,提升系統的穩定性和代碼質量。

依賴關係圖構建

  • 使用靜態分析工具分析項目中模塊的依賴關係
  • 根據項目類型分別構建依賴關係圖
  • 展示變更模塊對其他模塊的影響路徑

代碼變更分析

  • 使用版本對比工具分析代碼變更
  • 基於DIFF數據,統計變更的函數和變量
  • 根據依賴關係圖,初步分析變更的影響範圍

影響範圍標記

  • 從變更點出發,追蹤調用路徑,標記所有受影響的節點
  • 將影響範圍分為模塊、功能、接口和數據四類
  • 解析文件路由信息,輸出頁面列表

根據簡化後的代碼,可以快速理解核心功能的實現原理。

class CodeEffectAnalyzer {  private fileImports: { [key: string]: FileImport[] };
    // 收集文件的導入依賴  private collectImports(filePath: string, ast: any): void {    traverse(ast, {      ImportDeclaration: ({ node }) => {        // 記錄導入關係        node.specifiers.forEach((specifier) => {          this.fileImports[filePath].push({            filePath: path.resolve(path.dirname(filePath), node.source.value),            importedName: specifier.imported.name,            localName: specifier.local.name,          });        });      },    });  }
    // 分析文件,提取導出變量和函數  private analyzeFile(filePath: string): FileDetails {    const exports: FileExports = {};
    // 遍歷 AST,提取導出項    traverse(ast, {      ExportDefaultDeclaration: (path) => {         exports['default'] = generate(path.node).code;      },      ExportNamedDeclaration: (path) => {        const declaration = path.node.declaration;        exports[declaration.id.name] = generate(path.node).code;      },    });        return { exports };  }    // 影響面分析檢索  public analyzeImpact(affectedFiles: string[]): AffectedResult {    const analyzeImpactRecursive = (filePath: string): void => {      const { exports } = this.analyzeFile(filePath);      const modifiedList = Object.keys(exports); // 假設所有導出項都被修改      const referencedList: string[] = [];            // 找出引用了修改項的代碼      for (const imported of this.fileImports[filePath] || []) {        if (modifiedList.includes(imported.importedName)) {          referencedList.push(imported.localName);          analyzeImpactRecursive(imported.filePath); // 遞歸分析影響面        }      }    };        // 分析每個受影響文件    for (const file of affectedFiles) {      analyzeImpactRecursive(file);    }  }}

平台數據聚合

在各個系統平台之間實現系統穩定性數據的一致性和實時更新,以確保各個部分能夠獲取最新的、準確的信息,進一步實現高效協作和準確分析。

天網權限系統對接

  • 獲取菜單層級結構和頁面路徑信息,支持功能權限配置校驗
  • 數據扁平化轉換,微前端場景下提取子應用標識

研發協同平台同步

  • 獲取迭代需求效能數據,進行彙總與計算
  • 建立需求任務與代碼模塊的關聯

前端監控平台集成

  • 獲取頁面性能指標(首屏加載時間-FCP、接口響應耗時)、異常數據(JS異常數、接口成功率)以及流量數據(頁面訪問量-PV、頁面訪問數-UV)
  • 數據清洗工作(異常值過濾、重複數據移除),數據格式標準化

結果信息可視化

將代碼變更的影響範圍以直觀、易懂的圖形或圖表形式展示出來,並嵌入研發生命週期,幫助開發團隊快速理解變更的潛在影響,並做出相應的決策。

使用可視化工具

  • 通過圖形化界面直觀展示代碼變更的影響範圍,降低理解門檻
  • 交互聯動,點擊不同模塊直接跳轉至關聯的平台詳情頁

生成多維報告

  • 從多個核心維度分析影響面指標
  • 提供各維度的分析數據填充至報告模版

集成 CI/CD 流程

  • 在合併請求(MR)階段觸發影響面分析並生成報告
  • 同時支持手動創建影響面分析任務

數據庫設計

根據架構方案設計,規劃出如下四個表數據結構,用來存儲發佈應用數據、影響面結果數據、頁面異常/性能數據、研發效能等信息,支持高效查詢和擴展性。

業務效果

迭代發佈對系統整體的影響是多維度的,從不同視角進行發佈影響面的全面評估,可以協助責任人制定發佈重點監控方向,從而有效減少風險。

按人員類型劃分成不同角色視角

測試視角

研發視角

管理視角

按影響面維度劃分成多個展示效果

※  任務詳情

※  模塊列表

※  接口信息

※  需求信息

四、挑戰 & 優化

在大型項目中,模塊間的依賴關係複雜,如何高效、準確地構建依賴關係圖是一個挑戰。

挑戰1:複雜依賴關係分析

※  問題描述

  1. 代碼風格與框架差異。 不同項目採用不同技術棧、模塊化方案、動態語法及特殊語法導致解析困難重重
  2. 動態依賴難以追蹤。 運行時依賴(如按需加載、環境變量分支邏輯)無法通過靜態分析捕獲
  3. 系統路由規則差異。 不同系統採用不同的路由方案,其中微前端場景下,主應用與子應用的路由可能獨立管理,形成多層嵌套路由結構

※  解決思路

  1. 多語言/框架適配。 統一AST解析引擎,兼容主流模塊化規範
  2. 運行時依賴追蹤。 選擇動態分析工具並添加日誌記錄
  3. 統一路由元信息提取。 多框架路由解析適配器,微前端主子應用路由協同

挑戰2:跨內部平台系統集成

※  問題描述

  1. 接入流程繁瑣。 各內部平台系統需單獨申請權限配置令牌,重複操作多,維護成本高
  2. 數據實時性與一致性。各平台數據更新頻率不同,聚合時可能產生衝突

※  解決思路

  1. 模塊化設計架構。 功能模塊獨立開發,優先級劃分,MVP思維
  2. 數據版本快照。 版本控制管理,對關鍵數據人工干預兜底

優化1:跳過額外分析檢測

在CI/CD流程中,部分代碼變更(如文檔更新、配置文件調整)無需觸發完整的代碼影響面分析。通過檢測機制,可減少不必要的資源消耗,提升流水線執行效率。

  1. 條件判斷跳過分析。 根據變更文件類型或所在目錄信息,動態決定是否執行分析
  2. 提交信息比對。  比較兩次檢測之間的 commit** 差異,無內容主動跳過分析
  3. 白名單機制。 對特定文件或目錄配置白名單,包含無需分析的特定文件或目錄

優化2:緩存機制優化

合理的緩存策略和異步任務處理可以優化檢測效率,降低 CPU 使用率和內存佔用,進而提升系統整體性能。

  1. 設置適當的緩存失效策略。 以模塊或文件的唯一標識(如文件路徑、Git提交哈希)作為緩存鍵,當依賴項或代碼發生變更時,清空相關緩存
  2. 任務異步處理。 將依賴分析和 AST 解析任務異步處理,使用消息隊列將任務排入隊列,避免阻塞主線程

五、總結展望

通過實現一套自動化收集模塊級代碼影響面分析的方案,我們可以更精準地評估版本需求發佈對於系統整體穩定性的影響,從而提前確保重點模塊能夠得到有效的預警和監控,並創建相應的預案計劃。這將有助於提升研發自測能力、優化測試覆蓋率、評估系統複雜度,最終提高系統的穩定性和代碼質量。

之後我們將繼續優化影響面分析引擎,提升依賴關係分析的準確性和效率,進一步融合多維度數據,完成在線流量報表、全棧大盤數據建設,實現更高效的數據聚合和可視化展示,為開發團隊提供更強大的支持。

往期回顧

1. 得物自研DSearch3.0搜索核心引擎升級之路

2. 以細節詮釋專業,用成長定義價值——對話@孟同學 |得物技術

3. 得物可觀測平台架構升級:基於GreptimeDB的全新監控體系實踐

4. 大語言模型的訓練後量化算法綜述 | 得物技術

5. DPP推薦引擎架構升級演進之路|得物技術

文 / 卓翎

關注得物技術,每週更新技術乾貨

要是覺得文章對你有幫助的話,歡迎評論轉發點贊~

未經得物技術許可嚴禁轉載,否則依法追究法律責任。

user avatar king_wenzhinan 头像 openfuyao 头像 sunplay 头像 u_15878077 头像 histry 头像 weishiledanhe 头像 laggage 头像 nzbin 头像 xiaolvshikong 头像 danjuanfe 头像 alluxio_com 头像 blueberrypie 头像
点赞 25 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.