簡體   English   中英

基於SVN中的預提交

[英]Build on pre-commit in SVN

我知道已經有人問過這個問題,但我們真的想拒絕任何提交文件的嘗試,因為這會破壞中繼中的項目。 拒絕提交的文件的決定基於提交的文件所屬項目的構建過程的結果。 我知道在預提交階段不能同時訪問存儲庫,但這對我們來說不是問題,因為我們的構建速度非常快,並且我們可以容忍任何延遲。

有什么工具可以實現我們想要的? 注意,有必要重新編譯整個項目單元,而不僅僅是重新提交單個文件。

如果這不能以任何合理的方式完成,是否有可能在提交后的過程中構建代碼,然后在構建步驟失敗的情況下立即回滾? 可以將Hudson或其他工具配置為執行我們想要的嗎?

即使您的構建速度很快。 假設您可以在90秒內構建整個項目。 您是否希望人們每次提交代碼都等待90秒? 可能發生的事情是,人們只會做更少的承諾,做出更大的改變,並導致更多的錯誤。

首先要意識到,進行錯誤的修訂不是世界末日。 如果您盡早發現問題,則可以輕松地還原更改。 這里的關鍵是及早發現。

如果您還沒有這樣的系統,請使用像Jenkins這樣的持續集成系統。 每當有人對代碼進行更改時,Jenkins都會進行構建。 如果構建速度如您所願,那么當更改使構建中斷時,您會在幾分鍾之內收到通知。 如果您願意,您甚至可以讓Jenkins還原更改。 我們的理念是,開發人員有10分鍾的時間解決問題或還原他們的更改。 然后,我們把它們放在寨子里,並用腐爛的西紅柿去皮。 (實際上,人力資源部不允許我們這樣做。)

其次,設置易於遵循的標准,使開發人員可以確保所做的更改能夠生效。 我們有一些基本的:

  • 我們定義了一組所有開發人員都應該擁有的基本工具(Java,Ant,Subversion)。
  • 除了這三個基本工具之外,所有其他工具和所需的零件都放置在工作目錄中,並簽入Subversion。
  • 不需要特殊的環境設置。 構建不需要配置 ,等等。
  • 構建完成后,所有構建的對象都在工作目錄中完成。

這使我可以輕松地在我們的Jenkins服務器上設置構建。 而且,更重要的是,它使開發人員可以輕松使用Jenkins用於構建的相同構建系統。 如果他們可以構建它,詹金斯可以構建它。

接下來,您必須更改自己的開發文化 破壞構建是不好的。 一旦完成,Jenkins將公開羞辱任何破壞構建的開發人員。 我看到的一家商店設置了交通信號燈。 如果詹金斯(Jenkins)建築破裂,那么這些燈會變成紅色。 發生這種情況時,這很重要。 經理們出來,想知道發生了什么事。 當我在那里時,那些燈從未變紅。

當然,能夠運行構建是軟件非常非常第一步。 這是很小的一步-甚至是爬行。 不,甚至不是,這是六個月大的嬰兒第一次爬行的版本。 如果損壞的建築物是您的主要問題,那么您將遇到非常嚴重的問題。

確保所有代碼都可以編譯的下一步是確保代碼遵循編碼標准,並且代碼未執行可能有害的操作。 在Java世界中,它針對代碼運行Checkstyle,Findbugs和PMD。 Jenkins允許我發布漂亮的圖表,向我顯示這些程序的結果。 我們還將收集所有編譯警告和JavaDoc錯誤,並對它們進行圖形化處理。 如果這些過程中有太多警告,我們甚至可以設置Jenkins使構建失敗。 您的代碼可能會編譯,但是由於技術錯誤而導致構建失敗。

接下來是單元測試。 在Java世界中,它是JUnit,Jenkins再次顯示結果。 如果任何JUnit測試失敗,我們將使構建失敗。 如果您的基本界面不好,那么擁有良好的構建並不會帶來太多好處。

然后,介紹代碼。 我們有多少代碼正在接受單元測試。 為此,我們使用JaCoCo。 我們不會因為低代碼覆蓋率而導致構建失敗,但是我們確實向開發人員施加了提高代碼覆蓋率的壓力。 最后,我們可以進行其他測試。 我們部署並運行自動化的功能和系統測試。

開發人員所做的每項更改都一直貫穿於單元測試。 這是我非常喜歡Java的一件事,也是我認為Java開發遙遙領先的地方。 典型的Java構建可以在幾分鍾內完成。 我們很少能夠構建並在10分鍾內運行所有單元測試的情況很少見。 任何問題都應盡早發現並盡早解決。 而且,所有問題都在詹金斯公開展示。 我們看到誰破壞了構建或導致單元測試失敗。 我們看到誰收到需要修正的編譯器警告,或者進行了一些不良的編碼實踐。

並且由於我為開發人員提供了與Jenkins用於其構建的相同工具集,因此他們可以輕松地看到Jenkins將看到的內容。 他們也可以運行單元測試和代碼測試。 他們沒有理由提交導致更多問題的代碼。

這是您取得長足進步的地方:改進開發文化以關心他們的工作,並為壞習慣照亮。

擺在開發面前的障礙(例如使開發人員在每次提交后等待90秒以確保他們的更改得以建立)會引起怨恨,並且通常會適得其反。 您不再是團隊的一員,而是將每個人都視為潛在犯罪嫌疑人的建築警察 而是與開發人員合作,並說服他們他們想要的是對他們有利的。 一旦他們看到了,他們將與您合作,您的整個開發周期將更加順利。

我知道某些CI工具能夠執行“預提交CI”,因此,變更集首先發送到CI服務器進行構建,一旦成功構建,便會提交給SVN。

我沒有親自嘗試過這種功能,但我認為工作流程可能需要稍作更改(而不是直接提交,而是將更改發送到CI進行預提交構建)

快速構建:驗證構建

Teamcity:預先測試的提交

在大多數情況下,您提交到分支后,便會建立分支,如果成功,則分支代碼會合並到主干。 這最適合大多數沒有顯式支持您要求的SCM系統-考慮到scm僅發送已更改的文件,並且您需要簽出完整列表以使構建服務器正常工作(您實際上並沒有現在想根據以前的版本中剩下的文件進行編譯)。

SVN可以在pre-commit鈎子中高興地做到這一點,我在此鈎子中使用了perl腳本來檢查可接受的簽入注釋並拒絕可能添加到存儲庫中的狡猾文件類型,因此沒有理由不能簡單地運行腳本該命令簽出當前分支,然后將提交的文件復制到它們的頂部,進行構建,然后檢查構建日志。 要使預提交失敗,只需從腳本中返回1(返回0即可通過腳本)。

確切地說您需要什么很困難,因為我不知道您執行構建的內容或執行方式,但是您的腳本必須與任何預提交的鈎子腳本幾乎相同。 SVN提供了一些示例,您可以在Internet上看到更多示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM