主頁 > 軟體設計 > 當“代碼農”遇上“碼農”:揭秘主干開發的那些事兒

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

2023-06-08 09:34:30 軟體設計

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

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. 總結

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

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

作者:京東物流 趙勇萍

來源:京東云開發者社區

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/554623.html

標籤:其他

上一篇:驅動開發:內核封裝WFP防火墻入門

下一篇:返回列表

標籤雲
其他(160589) Python(38215) JavaScript(25484) Java(18209) C(15237) 區塊鏈(8270) C#(7972) AI(7469) 爪哇(7425) MySQL(7235) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4585) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2434) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1983) 功能(1967) HtmlCss(1955) Web開發(1951) C++(1933) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1879) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 當“代碼農”遇上“碼農”:揭秘主干開發的那些事兒

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

    uj5u.com 2023-06-08 09:34:30 more
  • 驅動開發:內核封裝WFP防火墻入門

    WFP框架是微軟推出來替代TDIHOOK傳輸層驅動介面網路通信的方案,其默認被設計為分層結構,該框架分別提供了用戶態與內核態相同的AIP函式,在兩種模式下均可以開發防火墻產品,以下代碼我實作了一個簡單的驅動過濾防火墻。WFP 框架分為兩大層次模塊,用戶態基礎過濾引擎`BFE (BaseFilteri... ......

    uj5u.com 2023-06-08 09:34:04 more
  • 移動應用架構新思路——WePY+小程式容器

    WePY(微信小程式開發框架)是一個基于組件化開發思想的微信小程式開發框架。它類似于Vue.js框架,通過封裝小程式原生的API,提供了更加簡潔、高效的開發方式。 WePY的主要特點包括: 組件化開發:WePY將頁面拆分為多個組件,每個組件有自己的樣式、模板和邏輯。這種組件化的開發方式能夠提高代碼的 ......

    uj5u.com 2023-06-08 09:33:49 more
  • 如何做架構設計?

    我們要尋求更好的技術方案,推動架構的良性演進,每一步都是經過深度思考的,而架構設計方法就是幫助我們思考的框架。通過做架構設計,我們應該提升軟體的質量和效率,降低風險和成本。 ......

    uj5u.com 2023-06-08 09:33:45 more
  • AI人工智能領域精美繪圖模板分享

    ![cover.jpeg](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e86fc6dcb452419498a7db6878591e30~tplv-k3u1fbpfcp-watermark.image?) #### 1 人工智能的發展歷程 如今 ......

    uj5u.com 2023-06-08 09:33:41 more
  • 當“代碼農”遇上“碼農”:揭秘主干開發的那些事兒

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

    uj5u.com 2023-06-08 09:33:35 more
  • 【618備戰巡禮】“三高”之第一高--如何打造高可用系統

    我們經常會說互聯網“三高”,那什么是三高呢?我們常說的三高,高并發、高可用、高性能,這些技術是構建現代互聯網應用程式所必需的。對于京東618備戰來說,所有的中臺系統服務,無疑都是圍繞著三高來展開的。對于一個程式員,或多或少都能說出一些跟三高系統有關的技術點,而我本篇文章的目的,就是幫大家系統的梳理一... ......

    uj5u.com 2023-06-06 19:10:35 more
  • 【618備戰巡禮】“三高”之第一高--如何打造高可用系統

    我們經常會說互聯網“三高”,那什么是三高呢?我們常說的三高,高并發、高可用、高性能,這些技術是構建現代互聯網應用程式所必需的。對于京東618備戰來說,所有的中臺系統服務,無疑都是圍繞著三高來展開的。對于一個程式員,或多或少都能說出一些跟三高系統有關的技術點,而我本篇文章的目的,就是幫大家系統的梳理一... ......

    uj5u.com 2023-06-06 19:10:01 more
  • C#設計模式19——裝飾器模式的寫法

    裝飾器模式(Decorator Pattern)是一種結構型設計模式,它允許你動態地給一個物件添加一些額外的職責,而不需要修改這個物件的代碼。 What(什么) 裝飾器模式是一種結構型設計模式,它允許你動態地給一個物件添加一些額外的職責,而不需要修改這個物件的代碼。 在裝飾器模式中,你可以定義一個裝 ......

    uj5u.com 2023-06-06 12:16:16 more
  • C#設計模式19——裝飾器模式的寫法

    裝飾器模式(Decorator Pattern)是一種結構型設計模式,它允許你動態地給一個物件添加一些額外的職責,而不需要修改這個物件的代碼。 What(什么) 裝飾器模式是一種結構型設計模式,它允許你動態地給一個物件添加一些額外的職責,而不需要修改這個物件的代碼。 在裝飾器模式中,你可以定義一個裝 ......

    uj5u.com 2023-06-06 11:57:40 more