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