本文獲文章作者授權(quán)翻譯,轉(zhuǎn)載需要注明來自公眾號EAWORLD。
作者:Sarah Goff-Dupont
譯者:月滿西樓
在構(gòu)建之外添加自動(dòng)化的手段,是真正用好CI的關(guān)鍵。
如果你已經(jīng)用了一段時(shí)間的Git了,相信你可能聽說過Git Hooks,甚至可能簡單的上手玩了玩。
Git Hooks在持續(xù)集成的語境中十分神奇,所以在本文中,我將深入介紹三個(gè)用例,并教你學(xué)會將現(xiàn)成可用的Hooks運(yùn)用到你的工作流程中。 如果你還是Git Hooks的菜鳥,也完全不用擔(dān)心, 因?yàn)槲覀儗幕A(chǔ)開始。
1.了解Git Hooks
Hook是Git系統(tǒng)的本地機(jī)制,用于在諸如代碼提交(Commit)和合并(Merge)之類的操作之前或之后觸發(fā)的定制化腳本,可以把它們看作是Git的插件系統(tǒng)。對Git-hooks有一個(gè)入門認(rèn)識的朋友都知道, 如果你進(jìn)去查看Git的.git目錄,你將看到一個(gè)“hooks”的子目錄,里面包含很多Hook腳本。
安裝Git Hooks其實(shí)很簡單,網(wǎng)上也有很多供查閱的參考文檔,在此就不討論這個(gè)問題了。
按照Git Hooks腳本所在的位置可以分為兩類: 客戶端Hooks和服務(wù)器端Hooks。
客戶端Hooks在本地工作站運(yùn)行, 而服務(wù)器端Hooks則在你的Git服務(wù)器上運(yùn)行。
還可以將Hook分類為Pre- 或Post-。Pre-receive Hooks腳本在某些特定的Git操作之前被調(diào)用, 可以利用這個(gè)Hook腳本來檢查推送過來的提交是否合法,如不合法,Git操作不被執(zhí)行,即客戶端的推送會被拒絕。它們實(shí)際扮演一個(gè)保鏢的角色,從后臺保護(hù)代碼庫, 防止你和項(xiàng)目成員提交錯(cuò)誤的代碼。當(dāng)從客戶端(本地庫)完成一個(gè)推送后, Post-receive Hooks將運(yùn)行,它不會拒絕Git代碼提交,但可以完成開發(fā)工作流程中的一系列自動(dòng)化任務(wù)。
使用Git Hooks,就像擁有一個(gè)小機(jī)器人助手, 可以實(shí)現(xiàn)Git相關(guān)的一系列自動(dòng)化任務(wù) (哈哈!) ?
Git Hooks可實(shí)現(xiàn)項(xiàng)目開發(fā)流程的一系列自動(dòng)化任務(wù),例如下面幾點(diǎn):
驗(yàn)證你在提交消息中包含了關(guān)聯(lián)的JIRA密鑰
在代碼合并前,確保滿足先決條件
發(fā)送通知給你開發(fā)團(tuán)隊(duì)的聊天室
在切換到不同的工作分支后,設(shè)置你自己的工作區(qū)
2.創(chuàng)建穩(wěn)定健康的工作分支
服務(wù)器端 Pre-receive Hooks是持續(xù)集成中的一個(gè)特別有力的補(bǔ)充,可以利用它來檢查代碼是否符合某些條件,防止開發(fā)人員隨意將代碼推送到master,就像精英忍者守護(hù)者一樣,保護(hù)代碼庫不受惡意代碼的影響。
開發(fā)人員通常都有足夠的責(zé)任心,當(dāng)他們在自己的工作分支測試上出現(xiàn)問題時(shí),他們不會將分支合并到主程序。但有時(shí)我們卻忘了檢查,特別是當(dāng)我們和其他人共享一個(gè)工作分支的時(shí)候,這時(shí)候會發(fā)生更多的更改或變化,雖然我們上次已經(jīng)檢查了分支的情況,但沒想到問題還是出現(xiàn)了。。。。。。
此時(shí),你就可以使用一個(gè)服務(wù)器端Hook,用于查找進(jìn)入master的合并, 找到時(shí), 腳本將檢查分支上最新的構(gòu)建,如果有測試失敗的情況,那么合并就會被拒絕。我的同事和Atlassian的開發(fā)者Tim Petterson為此編寫了一個(gè)Hook腳本
地址:https://bitbucket.org/tpettersen/git-ci-hooks/src/aad37a40bd0ffdef9a4188f1a7e1e5d768ca0fd1/update-green-builds-bamboo.rb
旨在與Bamboo合作,并使它在Bitbucket上可完美運(yùn)用。 你可以把它抓下來,定制它,并將其添加到你的代碼庫中。
3.保護(hù)你來之不易的代碼覆蓋率
我看到很多開發(fā)團(tuán)隊(duì)都在努力維護(hù)代碼覆蓋率。 很多情況下,他們不得不通過測試來追溯他們的源代碼庫。在沒有經(jīng)過測試驗(yàn)證支撐的情況下,當(dāng)很多功能被添加進(jìn)來時(shí),好不容易達(dá)成的代碼覆蓋率每況愈下,看到這樣的情景,實(shí)在令人心灰意冷。因此,Tim還編寫了一個(gè)pre-receive服務(wù)器端Hook,來保護(hù)master代碼覆蓋率不再下降。
地址:https://bitbucket.org/tpettersen/git-ci-hooks/src/aad37a40bd0ffdef9a4188f1a7e1e5d768ca0fd1/update-coverage-bamboo.rb
這個(gè)Hook也可以查找進(jìn)入到master的合并,然后調(diào)用持續(xù)集成服務(wù)器來檢查master以及分支上的代碼覆蓋率。如果分支的覆蓋有任何問題,則合并將被拒絕。
大多數(shù)持續(xù)集成服務(wù)器不會通過它們的遠(yuǎn)程API顯示代碼覆蓋數(shù)據(jù),但Git Hook腳本可以獲取代碼覆蓋報(bào)告。 要做到這一點(diǎn),構(gòu)建必須設(shè)置為將代碼覆蓋報(bào)告在master和工作分支上作為共享件發(fā)布。 一旦發(fā)布,你可以通過調(diào)用持續(xù)集成服務(wù)器從master獲取最新的覆蓋報(bào)告。對于分支覆蓋,你可以從最新的構(gòu)建中獲取覆蓋報(bào)告,也可以從正在提交的merge相關(guān)分支獲取覆蓋報(bào)告。
需要說明的是, 上述實(shí)踐的前提是你已經(jīng)運(yùn)行了代碼覆蓋。別指望這個(gè)Hook來干這件事——它只是在你的構(gòu)建結(jié)果中查找覆蓋率數(shù)據(jù)而已。 默認(rèn)情況下,這個(gè)腳本也適用于Bamboo,以及Clover(Atlassian的Java和Groovy代碼覆蓋工具)。但是它可以定制成與構(gòu)建服務(wù)器或代碼覆蓋工具結(jié)合在一起使用。
4.檢查分支構(gòu)建的狀態(tài)
朋友通常不會讓朋友去檢驗(yàn)有問題的分支。
那么此時(shí),我們就可以利用另一個(gè)客戶端Git Hooks: post-checkout Hook腳本,同樣也是由Tim編寫的,它在你的終端窗口中顯示分支創(chuàng)建狀態(tài)。該腳本從本地副本獲取分支的頭版本號,然后查詢持續(xù)集成服務(wù)器,查看是否已經(jīng)創(chuàng)建了該版本,并檢查創(chuàng)建是否成功。
地址:https://bitbucket.org/tpettersen/post-checkout-build-status/src
比如,你想在master中創(chuàng)建分支,這個(gè)Hook會告訴你, master上的head commit是否成功建立,這意味著可以用這個(gè)“安全的”提交來創(chuàng)建分支。 再如,如果這個(gè)版本的分支構(gòu)建失敗了,但是開發(fā)團(tuán)隊(duì)的墻板卻顯示了一個(gè)綠色創(chuàng)建(或者正好反過來)。這意味著你的本地副本已經(jīng)過期了,你可以自已決定是要更新版本還是繼續(xù)使用舊版本的本地副本進(jìn)行操作。
使用這個(gè)Hook對Atlassian的開發(fā)人員來說是無疑是一大神器,使他們避免了無數(shù)頭痛的困擾。如果你實(shí)在不能說服你的開發(fā)團(tuán)隊(duì)采用上面討論的服務(wù)器端Hook,那至少可以在你的本地工作站上安裝一個(gè),相信你絕對不會后悔的!
我在這里演示的所有用于持續(xù)集成的Git Hooks, 默認(rèn)都是基于和Bamboo、Clover、Bitbucket 結(jié)合使用的情形,但是請記住,Git Hooks實(shí)際上是廠商無關(guān)的,因此你可以將它們定制成與你自已的編碼工具結(jié)合使用,從而在開發(fā)過程中實(shí)現(xiàn)真正的自動(dòng)化。
原文鏈接:https://www.atlassian.com/continuous-delivery/git-hooks-continuous-integration
關(guān)于作者:
莎拉是一位Atlassian敏捷交付傳道者,之前是一名測試自動(dòng)化工程師,還是簡化書呆子式生活的忠實(shí)擁躉。例如,像持續(xù)集成和自動(dòng)化一樣。手動(dòng)測試越來越變得枯燥無趣,她試圖作出一些改變。她所崇拜的人包括瑪格麗特·撒切爾夫人、麥吉弗和她的母親。
關(guān)于EAWorld
微服務(wù),DevOps,元數(shù)據(jù),企業(yè)架構(gòu)原創(chuàng)技術(shù)分享,EAii(Enterprise?Architecture?Innovation?Institute)企業(yè)架構(gòu)創(chuàng)新研究院旗下官方微信公眾號。
微信號:eaworld,長按二維碼關(guān)注
8月-9月,PWorld系列技術(shù)趴還將繼續(xù)上演。目前,9月24日將在上海舉行PWorld MeetUP“微服務(wù)的編排、配置與12要素專場”已啟動(dòng)報(bào)名,戳“閱讀原文”可直達(dá)報(bào)名頁面,并了解更多詳情~
PWorld軟件架構(gòu)&平臺創(chuàng)新大會:由普元發(fā)起主辦的全國頂級技術(shù)盛會,探討“數(shù)字化時(shí)代的企業(yè)軟件變化與創(chuàng)新”推進(jìn)中國企業(yè)在數(shù)字化時(shí)代的成功轉(zhuǎn)型,積極為CTO、CIO、架構(gòu)師、技術(shù)經(jīng)理、開發(fā)工程師等技術(shù)相關(guān)人員設(shè)計(jì)各項(xiàng)議題,演講嘉賓從企業(yè)軟件、人工智能、區(qū)塊鏈、云計(jì)算、大數(shù)據(jù)、業(yè)務(wù)流程、移動(dòng)開發(fā)等熱門話題中,分享他們的技術(shù)見解和最佳實(shí)踐。同時(shí),PWorld在企業(yè)級技術(shù)會議里獨(dú)開“交互式體驗(yàn)”先河、賦予參會者最大程度尊重,帶給現(xiàn)場以及線上的聽眾以全新的參會體驗(yàn)。
閱讀原文:http://mp.weixin.qq.com/s?timestamp=1505207469&src=3&ver=1&signature=f-3TcZDMzoTvIoZBEciSHRKY6Nn2Nopb3QPOr5RsjeRfO71*zKC65oWFySSTrbB9fFY*yiYdvOKN*mI5D1R3rE3S-nuiBbTps*U0mCThqcWxqQAlD8ctTPhKjDvgqM2keQL8ZW2G04bDFGeDoehd2Ijra0aHY0kyLFIeN4zyuWE=&devicetype=Windows-QQBrowser&version=61030004&pass_ticket=qMx7ntinAtmqhVn+C23mCuwc9ZRyUp20kIusGgbFLi0=&uin=MTc1MDA1NjU1&ascene=1