工具
webhook實現遠程服務器拉取更新內容
生成公鑰
-
Git用戶公鑰
ssh-keygen -t rsa -C "[email protected]"
# 然後一直回車就行 # 生成的文件通常是 /root/.ssh/id_rsa,如果非root用戶請查看提示上的路徑
-
單獨的服務器用戶公鑰
sudo -Hu www ssh-keygen -t rsa
# 服務器運行PHP的用戶爲www,所以Hooks文件中涉及到權限的地方都需要聲明爲該用戶 # 所以也就需要在Remote中加入該用戶對應的公鑰 # 意思是爲www用戶生成公鑰 # 也是一直回車,中間會提示密鑰存儲位置
接下來將這兩個公鑰加入賬戶中,獲取對倉庫的權限
Hook文件
創建和修改目錄權限:
# 創建目錄
mkdir /mnt/wwwroot/xxxx
# 修改目錄權限
chown -R www:www /mnt/wwwroot/xxxx
用www用戶創建Hook文件,聲明權限
sudo -Hu www touch /data/wwwroot/xxxx/webhook.php
Hook文件內容
<?php
//git webhook 自動部署腳本
//項目存放物理路徑
$path = "/usr/xxx/gittest";
$requestBody = file_get_contents("php://input");
$content = json_decode($requestBody, true);
//if(empty($content)){
// die("sent fail");
//}
//若是主分支且提交數大於0
if ($content['ref']=='refs/heads/master' && $content['total_commits_count']>0) {
//$res = shell_exec("cd {$path} && git fetch --all && git reset --hard origin/master ");
//$res = shell_exec("cd {$path} && git add . && git commit -m 'commit by svn' && git pull && git push 2>&1");
$res = shell_exec("cd {$path} && git pull origin master");
$res_log = '-------------------------'.PHP_EOL;
$res_log .= $content['user_name'] . ' 在' . date('Y-m-d H:i:s') . '向' . $content['repository']['name'] . '項目的' . $content['ref'] . '分支push了' . $content['total_commits_count'] . '個commit:' . PHP_EOL;
$res_log .= $res.PHP_EOL;
file_put_contents("{$path}/log/".date('Y-m-d',time()).".txt", $res_log, FILE_APPEND);
}
?>
確保你的hook文件可以訪問,例如https://test.com/hook.php ,Hook文件準備完成.
配置Remote和服務器倉庫
-
配置公鑰,將之前生成的公鑰文件加入到Remote倉庫的SSH公鑰選項中
-
服務器倉庫
sudo -Hu www clone git@repo_address/gittest.git /自定義文件夾 # 意思是以www用戶的身份clone倉庫,權限屬於www用戶
-
添加WebHooks規則(本人用的阿里雲,所以在阿里雲操作)
在每個倉庫的設置中進行設置
可以選擇推送事件/標籤推送事件/評論/缺陷事件/合併請求/構建事件
鏈接中填寫外網訪問服務器Hook文件的地址, 點擊增加WEBHOOKS即可.
測試
在本地倉庫中:
vim test.txt
git add .
git commit -m "test hook"
git push
在服務器端:
# 查看更改是否拉取到服務器 vim test.txt