【git鉤子搭建】使用php腳本

工具

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章