前端資源遷移
目前公司的前端資源托管在svn服務器上,由於團隊的逐漸擴大,svn的分支管控越來越不靈活,而且對於以后前端流程一體化的處理支持不是很好,因此決定在版本控制上轉向git。git的好處不用多說:多分支並行開發,自動化構建,持續集成等等,這也是促使我們轉向它的原因。
具體操作中的問題
首先嘗試使用gitlab提供的web hooks進行觸發腳本控制。web hooks發出的post請求我們的php文件,在php中執行相關shell腳本,完成一體化構建。但是shell中的提示輸出信息無法在本地進行顯示,因此即使項目構建失敗,開發人員並無法在git命令行得到直觀的提示,用戶交互很不友好。經測試,只有放在remote端的hooks目錄下的腳本輸出信息才能呈現在終端,因此最終放棄此種方案。
gitlab提供的web hooks的底層實現-update.rb的邏輯是基於remote端的update hook。update hook 會在用戶每次push到remote時觸發,根據返回值是否為0,來決定此次push是否成功,它接收3個參數,第一個位push的引用分支名,第二個為push之前的分支sha1,第三個為push之后的sha1。update.rb封裝了提供了web hooks的功能,默認通過http post請求訪問我們的服務端,然后執行服務端的命令。最后,更新web界面。
其次把目光轉移到remote端的hooks目錄,將我們的update腳本放入hooks中,但是問題來了,由於gitlab提供的web hooks觸發也是基於update腳本,而且該update腳本軟連接到一個ruby腳本(所有的gitlab項目共用同一個ruby腳本),因此,無法針對前端工程制定特有的發布流程,只有手動將所有的前端工程軟鏈接到一個ruby腳本的副本(update_f2e),在這里做法就有點曲折:
1,首先,我們在update_f2e這個ruby中先執行原有的邏輯,最后執行我們自己寫的update(shell腳本),但是問題在於在update(shell腳本)中無法接收update_f2e傳入的參數,而且update(shell腳本)中的提示信息也無法顯示在終端,用戶體驗差,放棄;
2,然后針對調用流程重新構建,腳本全部ruby化。將我們的shell腳本的邏輯修改為ruby,在update_f2e中執行,問題仍然是輸出信息無法顯示,放棄;
3,究極版,將update_f2e這個ruby文件修改為shell腳本,在我們的shell腳本執行完畢之后,通過命令行執行原有的ruby邏輯,最終,目的達成。
說了這么多,嘗試了接近幾百次push,終於采用shell->ruby的方式完成hook的無害觸發,實現構建發布。
最后,方法3的方法有一個弊端,就是服務端的代碼更新成功,但gitlab的web界面卻無法更新,通過排查gitlab的ruby源碼,發現是在gitlab-shell/lib/gitlab_update.rb中的 api.allowed?()執行失敗造成,進一步深入gitlab_net.rb中,發現是我們的當前目錄影響了api.allowed?方法的判斷,因此在hooks/update的shell中切換到合適目錄之后,解決了該問題。