簡體   English   中英

Git:帶有 PHP_CodeSniffer 的預接收掛鈎

[英]Git: pre-receive hook with PHP_CodeSniffer

自從從 SVN 切換到 Git 后,我們失去了通過 subversion 服務器上的pre-commit hook 來執行我們的編碼標准的能力。

使用 Git,您只有客戶端上的預提交掛鈎,無法以任何方式強制執行 更糟糕的是,我們讓開發人員使用所有三個主要操作系統,因此在 Linux 或 OS X 上工作的預提交掛鈎不會自動在 Windows 上工作。

go 的方法是在服務器上實現一個pre-receive掛鈎,但解決方案並不像看起來那么簡單:

想象一下,開發人員做了 20 次提交並想要推送它們。 我所知道的所有 pre-commit 和 pre-receive 鈎子 ( 1 , 2 ) 只是檢查單個提交,這最終會失敗並阻止推送。 現在開發人員修復了問題並再次提交,並嘗試再次推送。 由於鈎子檢查單個提交,它會再次失敗。

所以我們需要一個pre-receive鈎子來生成所有提交中所有更改文件的列表,這些文件將被推送並僅在當前 state 上運行 phpcs。

這樣的鈎子腳本是否已經存在? 在哪里?

編輯:似乎有一個腳本可以創建該文件列表- 不幸的是在 Python 中,但可以移植。 我仍然對使用 PHPCS 的預制解決方案感興趣:)

我寧願不等待服務器端掛鈎來控制推送。

您可以設置一個中間存儲庫,它會非常定期地獲取每個開發人員的分支並審核每個新提交,如果提交未能滿足某些預定義的標准,則發送 email。

您也可以在中央存儲庫上設置預接收掛鈎,但至少開發人員會更快地意識到潛在問題。

我不喜歡“git-anese”,但在 Mercurial 中有一個名為“changegroup”的鈎子選項,它基本上檢查一組傳入提交的“頂部”提交。 也許社區中的某個人可以告訴您是否有等價物。 git 的“更改組”?

https://www.mercurial-scm.org/wiki/Hook#The_changegroup_hook

我不認為這里有技術解決方案,但如果你真的想打擾別人,那么將phpcs集成到你的 CI 設置中,並開始在你的問題管理器中為它打開票證。 ;-)

我不認為這是最好的主意,因為它真的不是技術問題。 你的問題不是提交前或提交后的鈎子,而是人們不這樣做,你認為你必須強迫他們。

總而言之,我理解編碼標准的重要性,並且我也執行它,但它有一個社會成分(或方面)。

聽起來和你一起工作的人要么不知道更好(還),要么不願意學習。 因此,如果他們不知道更好,您必須與他們合作並教他們遵守您的要求。 這包括教他們為什么約定很重要,最后他們需要明白,只有一切都變綠了,才能完成一項功能。

也許這需要項目管理(我猜是你)將一個問題分解為多個任務,直到他們得到它:

  • 功能本身
  • phpcs
  • 文件
  • 單元測試

(沒有特定的順序。;-))

如果他們不願意學習,你總是可以采取更嚴厲的措施。 就像,我會慢慢開始,每周進行一次績效評估(一對一的情況),並重申他們為什么不這樣做。 如果這沒有幫助——我想你明白我的意思了。

在 Drupal 項目中,我們最近遷移到 Git 並正在研究類似的問題。 在我們的例子中,我們不希望任何人簽入模塊的 LICENSE.txt 文件,因為我們的打包腳本會自動執行此操作。 經過一番反復,我們想出了一個接收鈎子,它不會拒絕錯誤的提交,但是每次它檢測到錯誤的提交(對於“錯誤”的某些定義)時,它都會自動在我們的錯誤中記錄一個關鍵錯誤跟蹤器。 這樣,代碼仍然被提交,但是模塊維護者和相應的網站管理員團隊都會立即收到通知,指出有問題需要修復。 您可以輕松發送 email 或發送推文或任何其他您想要的通知。

實際上我們還沒有完全實施,但這是我們的 Git 實施團隊有時間時正在制定的計划。 :-)

基本上,對於你描述的問題,除了改寫它之外,沒有好的解決方案; 而不是“阻止可檢測的違規行為”,而是“報告可檢測的違規行為”。 我認為這是你能做的最好的。

使用 jenkins + gerrit:

http://alblue.bandlem.com/2011/02/gerrit-git-review-with-jenkins-ci.html

如果您的構建失敗,推送將被拒絕。

http://source.android.com/source/life-of-a-patch.html

泰瑞爾

也許這個問題的答案有幫助? Git預收掛鈎

我使用了這個鈎子: http://criticallog.thornet.net/2011/06/02/running-php-linter-before-pushing-changes-to-a-git-repository/

並將其修改為還使用 phpcs 測試代碼。

可能包含一些錯誤,我已經硬編碼 drupal 代碼標准,但它可以工作! http://pastebin.com/fEmN519B

我們現在確實使用了預提交鈎子來檢查代碼和提交消息。

開發人員可以使用-n跳過它們,但他們很少這樣做,而且我們總是有另一個開發人員在做 QA,所以事情會引起注意。

鈎子很重要,因為它會注意到文件何時損壞,因此損壞的 PHP 或 JS 根本不會被提交。

https://github.com/netresearch/git-client-hooks找到它們的鈎子代碼

We use a central server for development, and our git hooks get automatically installed because we provide a central git repository template that gets used automatically when you git clone or git init .

這樣的鈎子腳本是否已經存在? 在哪里?

此處提供了一種使用 git 掛鈎運行 PHP linters 的方法: https://github.com/stevegrunwell/wp-enforcer

我沒有直接使用 pre-commit/pre-recieve 鈎子等的確切答案。

我從另一種方式解決這個問題,運行 CI 服務器,(我使用 jenkins)運行 phpcs 和 Jenkins 的 checkstyle 插件。

這使我可以根據 checkstyle 報告使構建和 email 提交者失敗。

可選地,我可以設置閾值,因此如果有多達 5 個新樣式違規,我會得到一個不穩定的構建,但如果提交超過 5 個則會失敗。

我還可以設置總體閾值,因此整個項目中超過 10 次違規會導致失敗並通過電子郵件發送給團隊。

如上所述,這可能是您的中間服務器。 構建后操作可以包括推送到另一個 git 存儲庫。

我們使用 git 包裝器(為了我們的目的,用更合理的東西替換 git-submodules),它具有從魔法目錄自動設置預提交掛鈎的副作用。 由於這是在商業環境中,因此沒有抱怨(無論如何都有辦法將其關閉)。

我也試過這個。 目前我手頭沒有代碼,但我使用了其中一個鈎子(不是預接收,我認為是更新的鈎子)來臨時簽出新的 ref。 你可以通過一個只需要更新的簽出樹和只做淺克隆來加快這個速度。

這允許訪問整個源代碼樹,您不僅可以在推送更改的文件上運行 CS,還可以運行單元測試或冒煙測試。

我也同意其他一些評論,即這些測試應該保持在最低限度,因為沒有什么比被提交鈎子阻塞更煩人的了。 任何進一步的檢查都應該在您的 CI 服務器或部署系統中進行。

檢查這個項目: https://github.com/phpro/grumphp它無法安裝預接收掛鈎,但可能會解決您的跨操作系統預提交掛鈎問題。

暫無
暫無

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

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