當“代碼農”遇上“碼農”:揭秘主幹開發的那些事兒

来源:https://www.cnblogs.com/Jcloud/archive/2023/06/07/17462470.html
-Advertisement-
Play Games

前段時期我負責部門內部主幹開發落地相關事宜,這個過程中,也真真切切的體會到了多人開發過程中,面對特性分支管理中,大家遇到的一些困擾,尤其面對敏捷迭代的開發方式,合併衝突,集成測試,代碼重用等方面,都與高效兩個字背離。當然,我在推進主幹開發過程中,也遇到了一些問題和坎坷,在這裡,集中的做一次分享。 ...


前段時期我負責部門內部主幹開發落地相關事宜,這個過程中,也真真切切的體會到了多人開發過程中,面對特性分支管理中,大家遇到的一些困擾,尤其面對敏捷迭代的開發方式,合併衝突,集成測試,代碼重用等方面,都與高效兩個字背離。當然,我在推進主幹開發過程中,也遇到了一些問題和坎坷,在這裡,集中的做一次分享。

1. 概述

主幹開發,是指開發人員直接向主幹(習慣上主幹分支通常為:trunk 或 master)提交 / 推送代碼。通常,開發團隊的成員 1 天至少 1 次地將代碼提交到主幹分支。在到達發佈條件時,從主幹拉出發佈分支(通常為 release),用於發佈。若發現缺陷,直接在主幹上修複,並根據需要 cherry pick 到對應版本的發佈分支。

優點:

  • 分支模型簡單高效,開發人員易於掌握不容易出現錯誤操作

  • 避免了分支合併、衝突解決的困擾

  • 隨時擁有可發佈的版本

  • 有利於持續集成和持續交付

缺點:

  • 基礎架構要求高:合入到主幹的代碼若質量不過關將直接阻塞整個團隊的開發工作,因此需要高效的持續集成平臺進行把關;

  • 自動化測試要求高:需有完備單元測試代碼,確保在代碼合入主幹前能在獲得快速和可靠的質量反饋;

  • 最好有代碼評審:若代碼質量要求高,需要配套代碼評審(CR)機制,在代碼提交到主幹時,觸發 CR,通過 Peer Review 後才能正式合入;

  • 最好有特性開關:主幹開發頻發合入主幹的情況下,特性拆分得很小,可能是半成品特性,需要配套特性開關(Feature Toggle),只有當特性整體開發完才通過灰度發佈等手段逐步打開;

適用環境:

  • 對迭代速度要求高,希望需求快速交付上線

  • 基礎架構強,持續集成工具高效;

  • 團隊成員習慣 TDD(測試驅動開發),代碼自動化測試覆蓋率高(至少增量代碼的自動化測試覆蓋率高);

2. 整體架構

2.1 衡量主幹開發的效果

可以通過執行以下操作來衡量主幹開發的效果。

測試的因素 衡量的指標 目標
應用代碼庫中的活躍分支數。 衡量應用代碼庫版本控制系統中的活躍分支數,讓所有團隊都能看到此數字。然後跟蹤目標狀態的增量式進度。 不超過三個活躍分支。
代碼凍結期。 衡量團隊的代碼凍結數及凍結時長。這些衡量指標還可以對合併衝突、代碼凍結、穩定等方面所耗費的時間進行分類。 無人提交代碼時,沒有代碼會被凍結。
將分支合併到主幹的頻率。 衡量合併的每個分支的二進位(是/否)值,或者衡量每天合併的分支的百分比。 每天至少合併一次。
查看審批代碼更改所需的時間。 如果您非同步執行代碼審核,請衡量審批更改請求所需的平均時間,並特別關註所需時間大大超過平均值的請求。 設法使代碼審核成為在開發過程中執行的同步活動。

2.2 常見誤區

如需全面採用主幹開發,需要避免以下常見障礙:

  • 繁瑣的代碼審核流程。許多組織的代碼審核流程都較為繁瑣,需要多次審批才能將更改合併到主幹中。如果代碼審核很費力並且需要數小時或數天才能完成,開發者會避免小批量工作,改為進行大批量更改。因為大批量代碼審核十分複雜,因此審核人員的審核時間會延長,進而造成惡性迴圈。

  • 這樣的結果是開發者避免使用合併請求,從而導致合併請求經常受到冷落。由於很難通過檢查來推導大規模更改對系統的影響,因此審核人員很可能會忽略缺陷,主幹開發的優勢也就減弱了。

  • 非同步執行代碼審核。如果您的團隊實行結對編程,那麼該代碼已由第二個人審核。如果需要進一步審核,則應該同步執行:開發者準備提交代碼時,應立即讓團隊中的其他人員審核代碼。開發者不應該要求進行非同步審核,例如向工具提交請求,然後在等待審核時啟動新任務。合併延遲時間越長,就越有可能發生合併衝突和相關問題。如果執行同步審核,需要團隊同意優先審核彼此的代碼而不是處理其他工作。

  • 在提交代碼之前未運行單元測試或者自動化測試。為了確保主幹保持工作狀態,在提交前對代碼更改運行測試非常重要。此操作可以在開發者工作站完成,許多工具也提供針對本地更改遠程運行測試,然後在通過測試後自動提交更改的功能。如果開發者知道自己無需大量繁雜流程即可將代碼提交到主幹,那麼就會小批量更改代碼,這些更改易於理解、審核、測試,並且可以更快地遷移到生產環境。

2.3 改進主幹開發的Tip

  • 小批量開發。主幹開發最重要的推動因素之一就是團隊學習如何小批量開發。這需要為開發團隊提供培訓和組織支持。

  • 執行同步代碼審核。如前所述,轉換為同步代碼審核或至少確保開發者優先進行代碼審核,有助於確保所做的更改不必等待數小時甚至數天即可合併到主幹中。

  • 執行全面的單元測試和自動化測試。確保您擁有全面而實用的自動化單元測試套件,併在每次提交之前運行這些測試工具。

  • 快速構建。構建和測試過程應在幾分鐘內執行。目標是將測試環境的jdos部署串聯到整個CI的自動化流水線之中

2.4 主幹開發流程說明

如圖所示,研發小伙伴基於master分支開發,當每次merge時,都會觸發流水線驗證過程。在流水線驗證中:

1.EOS代碼掃描,該掃描會掃描代碼中不規範的情況,按照代碼規約不同,會有不同的級別,包括 WARNING, MAJOR, CRITICAL, BLOCKER四種級別,基於不同級別可以設置攔截規則,如果代碼不符合設定的攔截規則,將不予merge。

2.代碼評審會觸發代碼評審邀請,可以根據設定,邀請組內研發,leader,或者測試人員參與代碼評審,通過設定規則,如果代碼評審通過,才允許merge。

3.現在自動進行maven打包和單元測試工作,如果單元測試不通過,將不予merge。

4.流水線會自動將單元測試通過的jar包發佈到測試的JOS分組進行部署,部署完成後自動調取線上自動化測試流程,只有所有介面通過自動化測試,才允許merge。

3. 落地方案

3.1 單元測試

應用架構: 基於spring boot junit 編寫單元測試。

我們可以將測試按照模塊劃分,放在不同的目錄之下,可以分為集成測試和單元測試。這樣做的原因是,當我們的項目邊的越來越大的時候,寫的測試會越來越多,當所有測試都放在一個目錄下的時候,跑一次集成測試時間會很長。具體目錄如下:

主開發目錄 測試開發目錄 測試模塊 描述 測試父類命名
src/ test/ init 初始化測試模塊 InitTestBase
unit service單元測試模塊 UnitTestBase
jpa 持久化層測試模塊 JPATestBase
mvc controller層測試 MvcTestBase

所有測試模塊集成對應的父類,然後類名必須以對應模塊+Test結尾,例如:ShipperStatisticUnitTest

  1. 引入單元測試依賴 spring-boot-starter-test
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
</dependency>


2. 引入 surefile 插件

 <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.2</version>
                <configuration>
                    <skip>false</skip>
                    <includes>
                        <include>**/unit/*Test.java</include>
                    </includes>
                </configuration>
</plugin>


3. 配置測試配置文件路徑

 <resources>
        <testResources>
            <testResource>
                <directory>src/test/resources</directory>
                <!--①-->
                <excludes>
                    <exclude>application*.properties</exclude>
                </excludes>
            </testResource>
            <testResource>
                <directory>src/test/resources</directory>
                <filtering>true</filtering>
                <includes>
                    <include>application.properties</include>
                    <include>important.properties</include>
                    <include>application-${activatedProperties}.properties</include>
                </includes>
            </testResource>

        </testResources>


3.2 JaCoCo代碼覆蓋率掃描

該處可以先串聯到流水線中,但不做門禁設置,等後期確定標準後,再打開門禁設置。

3.3 EOS靜態代碼掃描

在主幹開發模式中,因為EOS靜態代碼掃描,配置代碼合併門禁,確保代碼編碼規範。配置如下圖所示例子:

3.4 代碼線上評審

代碼評審通過Coding內置的評審規則實現,規則設定如下:

1.評審分支為master分支,併在push時創建代碼評審,並阻塞代碼直接合入目標分支。

2.評審人需要達到兩人及以上通過後,才能觸發隨後的操作。

3.不允許自評。

4.不允許特定成員跳過自動化檢查。

3.5 特性開關

遇到此情況,一般是多版本同時開發的情況

此處跟業務強相關,需要具體問題具體分析。不過保證如下幾個原則:

  • 代碼開發儘量保證高內聚低耦合,保證類的封閉性,同時可以用常用設計模式,保證功能的業務代碼解耦,有利於特性區分。

  • 個別情況,可以引入ducc配置中心,實現特性開關。

3.6 流水線配置

在行雲流水線中,主要包括如下幾個節點:

其中有一個配置上有一個小坑就是下載代碼。為什麼這麼說呢?

因為我們流水線的觸發條件是跟coding上的代碼評審配合使用,當主幹分支發生merge請求時,這個時候會觸發流水線,但拉取的代碼並不能直接填寫主幹分支名稱(如:master), 原因是當前的commit快照並沒有合併到master上,而是處於等待狀態,只有當流水線通過後才會真正合併到主幹分支,這是如果下載代碼裡拉取的主幹分支就是不包含當前提交內容的快照,並不能滿足我們的訴求。

那麼,我們該如何配置呢?

好在Webhook中會帶一些系統內置全局參數,其中globalParams.user.WEBHOOK_ATTR_COMMIT_ID,代表的就是當前提交請求所包含的 commit快照,所以,我們只需要配置這個全局參數即可,如圖所示:

配合如上配置,我們在觸發設置中,只需要設置MR created/Updated事件即可。如下圖所示:

4. 總結

於許多開發者而言,主幹開發是一項重大變革,您很可能會遇到一些阻礙。許多開發者根本無法想像如何採用這種方式工作。一項好的做法是找到曾採用這種方式工作的開發者,讓他們指導其他開發者。讓一些團隊轉為採用主幹開發方式工作也很重要。實現此目標的一種方法是將大量具有主幹開發經驗的開發者召集到一起,這樣至少有一個團隊遵循主幹開發做法。然後,如果您確信遵循此做法的團隊發揮預期的作用,則可以將其他團隊轉換為這種風格。

當然主幹開發也不是銀彈,他也會有一些自己的弊端,比如在處理需求變更,或者同時多版本並行開發時,也需要建立多個臨時分支支持,想做到純粹的主幹開發,也是過於理想化的結果。

作者:京東物流 趙勇萍

來源:京東雲開發者社區


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 長期更新版文檔請移步語雀([「AntV」X6開發實踐:踩過的坑與解決方案 (yuque.com)](https://www.yuque.com/sxd_panda/antv/x6)) ## 🖼️ | 如何自定義拖拽源? > 相信你們在開發中更多的需求是需要自定義拖拽源,畢竟自定義的功能擴展性高一些 ...
  • 在 Vue2.0中,代碼復用和抽象的主要形式是組件。然而,有的情況下,你仍然需要對普通 DOM元素進行底層操作,這時候就會用到自定義指令。你可以將一些 css樣式抽象到指令中,也可以將一些 js 操作放到指令中去執行。就使用上來說,指令不用像組件一樣需要引入和註冊,註冊後使用非常簡潔方便。對於在項目... ...
  • Vue3簡介 Vue3是Vue.js的最新版本,於2020年9月18日正式發佈。Vue3相比Vue2有很多改進和優化,包括但不限於: 更快的渲染速度:Vue3通過使用Proxy代理對象和優化虛擬DOM演算法等方式,提高了渲染性能。 更小的體積:Vue3的體積比Vue2更小,打包後的文件更小,載入速度更 ...
  • # 1. Iconfont * 阿裡傾力打造的矢量圖標管理、交流平臺,設計師將圖標上傳到 iconfont 平臺,用戶可以自定義下載多種格式的icon,平臺也可將圖標轉換為字體,便於前端工程師自由調整與調用。 * 地址:Iconfont ![](https://img2023.cnblogs.com ...
  • 一、前言 針對目錄結構、CSS規範、JavaScript規範、Vue規範 可參照官方給出的 [風格指南](https://v2.cn.vuejs.org/v2/style-guide/index.html) 這裡主要總結業務開發中常遇到的代碼問題和實踐,幫助大家後續各自做好codeReview,一些 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言 🛰🛰 我們在無論是在查閱別人的代碼,還是在實際項目開發的過程中,肯定都會使用導入導出的功能,有時候我們會搞混這幾種方式到底有什麼區別,今天我們就來細緻的區分一下: 導入導出方式⚔️⚔️ 我們都知道最常見的幾種導出方式無非是exp ...
  • 我們要尋求更好的技術方案,推動架構的良性演進,每一步都是經過深度思考的,而架構設計方法就是幫助我們思考的框架。通過做架構設計,我們應該提升軟體的質量和效率,降低風險和成本。 ...
  • ![cover.jpeg](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e86fc6dcb452419498a7db6878591e30~tplv-k3u1fbpfcp-watermark.image?) #### 1 人工智慧的發展歷程 如今 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...