來(lái)源:派臣科技|時(shí)間:2020-09-09|瀏覽:次
你的設(shè)計(jì)系統(tǒng)團(tuán)隊(duì)是如何通知訂閱者新的特性已經(jīng)發(fā)布,bug正在被修復(fù),或者安全漏洞正在被修補(bǔ)?Patrick討論了版本控制策略和自動(dòng)化流程的優(yōu)勢(shì)。
想象一下,如果你愿意,我們是一個(gè)團(tuán)隊(duì)的一部分,一起工作來(lái)生產(chǎn)一些軟件。我們的團(tuán)隊(duì)知道,在六個(gè)月內(nèi),我們的最小可行產(chǎn)品(MVP)需要準(zhǔn)備好發(fā)布。我們也知道,在最初的版本發(fā)布之后,我們的團(tuán)隊(duì)將繼續(xù)對(duì)我們的產(chǎn)品進(jìn)行迭代:我們將修復(fù)bug,我們將添加新特性,我們將修補(bǔ)安全漏洞,甚至有一天,我們可能會(huì)棄用或刪除部分產(chǎn)品。
實(shí)際上,我們的產(chǎn)品可以是任何類型的軟件,但在本文的其余部分中,我將描述的產(chǎn)品是一個(gè)設(shè)計(jì)系統(tǒng),由許多單獨(dú)的組件組成。作為設(shè)計(jì)系統(tǒng)的生產(chǎn)者,我們將自己稱為為訂閱者維護(hù)系統(tǒng)的發(fā)布者。
項(xiàng)目和產(chǎn)品
在我職業(yè)生涯的大部分時(shí)間里,我都在機(jī)構(gòu)從事項(xiàng)目工作,而這些項(xiàng)目大部分都圍繞著網(wǎng)站和網(wǎng)絡(luò)應(yīng)用。這些項(xiàng)目通常都有一個(gè)結(jié)束日期,也就是啟動(dòng)日期。即使當(dāng)我的同事和我與其他團(tuán)隊(duì)合作提供長(zhǎng)期支持和維護(hù)時(shí),這種類型的工作在計(jì)劃、路線圖和用戶關(guān)注方面也不同于產(chǎn)品工作。
在設(shè)計(jì)系統(tǒng)的上下文中尤其如此,其中設(shè)計(jì)系統(tǒng)團(tuán)隊(duì)的角色是發(fā)布者,而受眾的角色是訂閱者。Nathan Curtis談到了從項(xiàng)目到產(chǎn)品思維模式的轉(zhuǎn)變,他指出,一個(gè)系統(tǒng)是“一個(gè)活的、不斷發(fā)展的、將服務(wù)于其他產(chǎn)品的產(chǎn)品的起源故事”。
對(duì)我來(lái)說(shuō),這種心態(tài)轉(zhuǎn)變的有趣之處在于,很多人——如果不是所有人的話——已經(jīng)習(xí)慣了扮演我提到的其中一個(gè)角色。不管我們是否意識(shí)到,我們都是訂閱用戶。
想想看:你最近有沒(méi)有更新安卓或iOS應(yīng)用程序?你是否在公寓或家里為物聯(lián)網(wǎng)設(shè)備安裝了新版本的固件或軟件?你有升級(jí)到最新版本的Windows或MacOS嗎?我覺(jué)得很有可能是你干的祝賀您,您是軟件的一部分(或多個(gè)部分)的訂閱者。
現(xiàn)在,想一下這個(gè)的另一邊。如果您負(fù)責(zé)創(chuàng)建和維護(hù)我上面提到的某個(gè)軟件,您將如何向您的訂閱者表明您的團(tuán)隊(duì)已經(jīng)在軟件中構(gòu)建了新特性、修復(fù)了漏洞或修補(bǔ)了安全漏洞?您需要向您的訂閱者提供哪些關(guān)于您的更改的文檔?要使發(fā)布者到訂閱者的過(guò)程發(fā)生,您需要什么樣的工作流?
我在這里暗示的是一個(gè)發(fā)布策略,它由三個(gè)概念組成:為我們的整個(gè)設(shè)計(jì)系統(tǒng)或每個(gè)單獨(dú)的組件維護(hù)一個(gè)版本號(hào)方案。2. 創(chuàng)建一個(gè)變更記錄——一個(gè)變更日志——這樣我們的訂閱者就知道這個(gè)版本和上一個(gè)版本有什么不同。3.將系統(tǒng)或其組件的新更新版本發(fā)布到訂閱者可以使用它的地方。
讓我們?cè)偕钊胙芯恳幌逻@些概念。
版本
我們的團(tuán)隊(duì)在過(guò)去的六個(gè)月里努力工作,我們的MVP已經(jīng)準(zhǔn)備好要發(fā)布給全世界了!恭喜你!我們終于發(fā)布了1.0版!但是這個(gè)版本號(hào)代表什么?它來(lái)自哪里?當(dāng)我們不可避免地要對(duì)我們的產(chǎn)品進(jìn)行一些更改時(shí),下一個(gè)版本號(hào)是什么?
語(yǔ)義版本控制(Semantic Versioning, Semver)是一種流行的規(guī)范,我們的行業(yè)使用它來(lái)描述公共接口版本之間的變化。每個(gè)版本都直接綁定到一個(gè)版本號(hào)上,該版本號(hào)由三個(gè)用句點(diǎn)分隔的數(shù)字組成。這三個(gè)數(shù)字分別表示主、小和補(bǔ)丁(例如:3.10.2),每個(gè)數(shù)字都有一系列有序的版本。Semver網(wǎng)站將major、minor、patch的語(yǔ)義差異總結(jié)如下:
給出一個(gè)版本號(hào)MAJOR.MINOR。補(bǔ)丁,增加:1。當(dāng)你做不兼容的API更改時(shí),主要版本2。當(dāng)您以向后兼容的方式添加功能時(shí),將使用次要版本;修正向后兼容的錯(cuò)誤時(shí)的補(bǔ)丁版本。”
我并不打算在本文中詳盡地介紹Semver及其復(fù)雜性,但是了解major、minor和patch非常重要——尤其是在Node上下文中。因?yàn)镾emver內(nèi)建在npm管理其包的方式中。檢查包。json用于我們的彈跳球項(xiàng)目,這是一個(gè)很好的練習(xí),可以輕松理解項(xiàng)目如何管理它的包。當(dāng)您查看這里列出的依賴項(xiàng)和devDependencies時(shí),打開(kāi)這個(gè)備忘單,看看我們的包是如何運(yùn)行的。json指的是版本和范圍。
版本控制…什么?
既然我們已經(jīng)討論了版本和版本號(hào)背后的一些含義,那么讓我們來(lái)討論一下我們到底在控制什么版本。在本文的開(kāi)始部分,我們?cè)O(shè)想我們的團(tuán)隊(duì)正在努力為我們的設(shè)計(jì)系統(tǒng)構(gòu)建組件。當(dāng)我們開(kāi)始我們的項(xiàng)目時(shí),我們決定使用Git將我們所有的設(shè)計(jì)系統(tǒng)代碼包含在一個(gè)存儲(chǔ)庫(kù)中。
在開(kāi)始的時(shí)候,我們的團(tuán)隊(duì)需要決定它作為發(fā)布者的角色:我們的訂閱者應(yīng)該如何使用我們的組件?設(shè)計(jì)系統(tǒng)應(yīng)該是它自己的單一包,訂戶帶進(jìn)他們的項(xiàng)目,批發(fā)?或者設(shè)計(jì)系統(tǒng)應(yīng)該是許多可單獨(dú)訂閱的包的容器,讓我們的消費(fèi)者選擇他們想要的包以及這些包何時(shí)更新?
這兩種策略都有利有弊,在我看來(lái),大多數(shù)的利弊都是圍繞著計(jì)劃,以及出版商和訂閱者應(yīng)該把他們的時(shí)間和精力花在哪里和如何上。
例如,如果您的設(shè)計(jì)系統(tǒng)作為一個(gè)單獨(dú)的包來(lái)管理和發(fā)布,您的團(tuán)隊(duì)可能會(huì)發(fā)現(xiàn)開(kāi)發(fā)一個(gè)發(fā)布周期是有利的——可能是每月或每季度。隨后,團(tuán)隊(duì)可能會(huì)發(fā)現(xiàn)它可以預(yù)測(cè)每個(gè)版本的特性、修復(fù)和其他工作的數(shù)量。這種可預(yù)測(cè)性不僅可以幫助發(fā)布團(tuán)隊(duì),還可以幫助訂閱團(tuán)隊(duì)制定計(jì)劃和路線圖。
相反,也許你的訂閱者不想更新到整個(gè)設(shè)計(jì)系統(tǒng)的最新版本——也許他們不能。可能有一個(gè)或一組包他們無(wú)法更新,他們現(xiàn)在面臨著落后的風(fēng)險(xiǎn),直到他們能夠優(yōu)先更新。也許,如果設(shè)計(jì)系統(tǒng)單獨(dú)發(fā)布它的軟件包,訂閱者將能夠根據(jù)他們自己的條款更新到這些更新的軟件包。
無(wú)論您的團(tuán)隊(duì)選擇哪種管理策略——單個(gè)包還是多個(gè)、單獨(dú)的包——重要的是要關(guān)注您的訂閱者??紤]一下,如果您是訂閱者,您希望如何讓更新和發(fā)布傳遞給您。想想你的訂閱者需要什么才能保持最新,想讓他們更新或遷移到你的最新版本需要什么。嘗試考慮每個(gè)更新的下游影響,無(wú)論它們是單個(gè)包還是多個(gè)包。最終,團(tuán)隊(duì)的利益相關(guān)者就是它的訂閱者。
但是,不要讓這壓倒了你的團(tuán)隊(duì)。安慰的事實(shí),你的團(tuán)隊(duì)是由聰明的人誰(shuí)習(xí)慣于成為訂戶。鼓勵(lì)他們想想上一次在其他項(xiàng)目中更新Rails或npm依賴項(xiàng)是什么時(shí)候,以及那種體驗(yàn)是什么樣的。
版本控制…如何?
我剛剛討論了哪些團(tuán)隊(duì)將進(jìn)行版本控制,但是我還想提到團(tuán)隊(duì)如何使版本控制過(guò)程更容易、更準(zhǔn)確。
首先,您可能知道(也可能不知道)包含許多包的存儲(chǔ)庫(kù)通常被稱為單一存儲(chǔ)庫(kù)。使用monorepo方法的一些流行項(xiàng)目的例子包括Babel、React、Meteor和Jest。假設(shè)我們的設(shè)計(jì)系統(tǒng)項(xiàng)目是由許多包(我們的組件)組成的,那么我們的設(shè)計(jì)系統(tǒng)也可以被稱為單體系統(tǒng)是有意義的。
包括我上面列出的那些流行的,單一pos傾向于分享的一個(gè)特點(diǎn)是,他們利用自動(dòng)化來(lái)管理他們的版本號(hào)。不管你的設(shè)計(jì)管理系統(tǒng)作為一個(gè)單獨(dú)的包或盡可能多的個(gè)人包,我想我們都同意,我們的團(tuán)隊(duì)?wèi)?yīng)該花費(fèi)時(shí)間構(gòu)建驚人的組件和解決問(wèn)題subscribers-not陷入困境在如何包需要撞他們的下一個(gè)版本,這些版本是什么,等等。坦白地說(shuō),不自動(dòng)化這個(gè)過(guò)程聽(tīng)起來(lái)像是導(dǎo)致混亂和最終的災(zāi)難。
幸運(yùn)的是,有一個(gè)名為L(zhǎng)erna的工具可以幫助管理使用Git和npm的單機(jī)操作流程。Lerna最初是作為管理巴別塔單礦石的工具開(kāi)始的,在它被提取出來(lái)成為它自己的獨(dú)立工具之前。
Lerna將處理你的版本,但它真的照當(dāng)你深究它的一些其他功能,如結(jié)合它與傳統(tǒng)致力于自動(dòng)生成更新日志文件和配置注冊(cè)表自動(dòng)發(fā)布你的包,這是我們將會(huì)討論接下來(lái)的兩個(gè)概念。
更新日志
我們以前討論過(guò)編寫(xiě)發(fā)布說(shuō)明,但是維護(hù)設(shè)計(jì)系統(tǒng)中所有組件的發(fā)布說(shuō)明或更改日志對(duì)于您的訂閱者來(lái)說(shuō)是非常重要的,這可能會(huì)讓人望而生畏。幸運(yùn)的是,有一些工具可以為您自動(dòng)執(zhí)行這個(gè)過(guò)程。
我在上面提到過(guò),您可以使用Lerna自動(dòng)生成更改日志文件,但是如果您不使用Lerna,另一個(gè)需要研究的工具是semantic-release。這個(gè)工具將自動(dòng)化整個(gè)發(fā)布工作流,包括確定下一個(gè)版本號(hào),生成發(fā)布說(shuō)明,以及發(fā)布一個(gè)或多個(gè)包。
Lerna和語(yǔ)義發(fā)布都使用存儲(chǔ)庫(kù)的提交消息,不僅可以理解要執(zhí)行的版本增量的類型,還可以編譯每個(gè)發(fā)布生成的變更日志。這對(duì)于您的團(tuán)隊(duì)來(lái)說(shuō)是非常強(qiáng)大的,因?yàn)橹灰麄儓?jiān)持傳統(tǒng)提交規(guī)范,變更日志生成的自動(dòng)化過(guò)程——以及版本號(hào)的遞增——就會(huì)自行處理。剩下的惟一部分就是將最新更新和文檔化的包分發(fā)給您的訂閱者。
發(fā)布到注冊(cè)表
我們已經(jīng)增加了版本號(hào),我們已經(jīng)創(chuàng)建了變更日志來(lái)描述我們的變更,現(xiàn)在是時(shí)候?qū)⑽覀兊陌l(fā)送到訂閱者可以獲得它們的地方了——通常稱為包注冊(cè)表。
在Node的上下文中。npm是最流行的注冊(cè)——特別是對(duì)于公開(kāi)可用的節(jié)點(diǎn)包。GitHub現(xiàn)在擁有npm,它有自己的包注冊(cè)表,允許公有和私有發(fā)布,JFrog Artifactory也允許私有發(fā)布。
包發(fā)布是我們工作流程的另一部分,如果手工完成,可能會(huì)令人生畏。如果您認(rèn)為這是我提倡自動(dòng)化流程的另一種情況,那么您是對(duì)的!幸運(yùn)的是,我上面提到的兩個(gè)工具,Lerna和語(yǔ)義發(fā)布,是為了自動(dòng)發(fā)布包而構(gòu)建的。
為了發(fā)布包,這兩種工具都會(huì)執(zhí)行類似的過(guò)程,以確定注冊(cè)中心中是否存在具有相應(yīng)版本號(hào)的包。只有在注冊(cè)表中不存在與其對(duì)應(yīng)的版本號(hào)時(shí),包才會(huì)被發(fā)布。這可以防止您的包覆蓋自己,并防止新更改污染已經(jīng)發(fā)布的包。您的訂閱者將知道任何遞增的版本號(hào)都表明他們?cè)噲D更新的軟件包有了一些新的變化。
通過(guò)自動(dòng)化釋放
作為開(kāi)發(fā)人員,我們知道自動(dòng)化我們的流程和工作流的好處。將設(shè)計(jì)系統(tǒng)發(fā)布后的過(guò)程自動(dòng)化(管理版本號(hào)、編譯變更日志和處理包發(fā)布)可以讓您的團(tuán)隊(duì)專注于真正重要的事情:通過(guò)構(gòu)建和維護(hù)優(yōu)秀的軟件,成為訂閱者的優(yōu)秀合作伙伴。