【需求簡介】:本人目前需要實現本地提交程式碼至 GitLab,同時伺服器端自動同步,經過了解可以通過 GitHub / GitLab 的 Webhooks (俗稱:鉤子)來實現
【選擇原因】:為什麼是 GitLab 而不是 GitHub ? 眾所周知 GitHub 是開源專案託管平臺且建立私有倉庫是要付錢的,而 GitLab 的社群版 ( 免費版 ) 不但能建立免費的私有倉庫而且沒有數量上線,參與的人員也沒有數量限制,並且能設定成員的許可權,甚至細緻到具體某條分支的許可權,以及強大的工作流等.所以我認為 GitLab 非常適合中小型非開源專案公司,並且雖然這麼說你可以看到其實不少大型公司(如下圖)也會將他們的一些專案託管到 GitLab 上.所以我認為GitLab 是一個不錯的選擇
【正式部署】:首先你得先生成一個SSH Key 在你希望自動同步的伺服器上
# @ 具體流程如下
- Git 安裝
- SSH Key 生成
- Config 配置
- SSH Keys 新增&匯入
- SSH 測試連線
- Hooks 指令碼編寫
- Webhooks 配置
【生成命令】:
# @ Command
ls -al ~/.ssh
# @ 出現如下提示則代表系統還沒有 SSH Keys 需要我們去建立
# @ Command
ssh-keygen -t rsa -C "<Your Mail>" -b 4096
# @ 建立 SSH Key ( 注意:這裡有郵箱建議和 Gitlab 中專案擁有者的郵箱一致以免發生一些未知錯誤 )
# @ Command
eval $(ssh-agent -s)
ssh-add ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub
# @ 新增 SSH Key && 檢視 SSH 公鑰 ( 複製公鑰用於稍後的配置 )
# @ Windows 檢查 Apache 登陸身份
注意!!!這是十分重要的一步對於使用 Windows 的同學來說,本人曾在這個問題上浪費了大量的時間,接下來講下大致原理,Webhooks 觸發時是一個HTTP請求,然後由 Apache 伺服器呼叫 PHP,PHP 再呼叫 cmd.exe,並且會去尋找 Apache 登陸身份目錄下的 .ssh 目錄尋找公鑰以驗證 SSH Keys 實現遠端私有倉庫免登陸和伺服器進行通訊,那麼這就會帶來兩個極其容易出現問題的地方:PHP exec / shell_exec 等呼叫 cmd.exe 方法的許可權的問題,以及公鑰存放目錄與 Apache 登陸身份目錄 不一致導致的 SSH Keys 驗證失敗直接導致 PHP 指令碼無法執行 Git Pull 命令,而直接執行命令指令碼則正常的詭異情況
# @ Gitlab 配置 SSH
# @ 測試連線
ssh -Tv git@gitlab.com
【鉤子指令碼】:
# @ PHP Hooks Script ( 演示的關係我們編寫一個最簡單的指令碼 )
<?php
$Res_Command = exec("git checkout master 2>&1 && git fetch origin master2>&1 && git reset --hard origin/master 2>&1", $Arr_Debug);
var_dump($Arr_Debug);
?>
【配置鉤子】:
【正式完成】:克隆下遠端倉庫,然後測試下鉤子即可,在這感謝下公司的兩位同事對我的提點,最後秉承著分享的精神希望這篇文章能幫助到有需要的人
【參考資料】:問題解決的過程中,參考了非常多的資料(紅色標註的三篇參考最為關鍵,當然也同時感謝其它資料中作者所提供的思路)
# @ Most Important
https://gitlab.com/help/ssh/README
http://blog.csdn.net/thy38/article/details/49827407
https://segmentfault.com/a/1190000009232433
# @ About PHP Function "exec"
http://www.cnblogs.com/nerrissa/articles/4929462.html
http://php.net/manual/zh/function.shell-exec.php
http://blog.csdn.net/nksmiles/article/details/7371721
http://www.piaoyi.org/linux/Gitlab-GitHub-webhook-push-auto-deployment.html
http://www.tuicool.com/articles/2YR3IzN
https://gitlab.com/help/user/project/integrations/webhooks
# @ How To Create SSH Keys
https://git-scm.com/book/zh/v2/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-%E7%94%9F%E6%88%90-SSH-%E5%85%AC%E9%92%A5
# @ GitLab PHP Hooks Script Example
https://github.com/mdluo/github-webhook-handler-php
本作品採用《CC 協議》,轉載必須註明作者和本文連結