鉤子是什么阳啥,就是將本地代碼推送至github后自動將代碼同步至服務器桌粉。
搭建步驟
- 在服務器查找運行php的用戶哨颂,為他生成deploy-key车柠,保存在github上
- 在服務器拉取項目倉庫
- 在服務器項目根目錄下建立代碼同步的deploy.php
- github上設置倉庫的webhooks
- 本地拉取倉庫提交代碼測試
1.設置deploy-key
查找php是什么用戶運行的
ps aux | grep php
我的顯示是www用戶 但是查看所有用戶
cat /etc/passwd | grep www
查找出來是www-data
查找用戶組
cat /etc/group | grep www
查找出來也是www-data
所以我判定我的php執(zhí)行用戶是www-data 屬于www-data用戶組
配置服務器git:
git config --global user.name "name"
git config --global user.email "email"
執(zhí)行命令
sudo -Hu www-data ssh-keygen -t rsa
生成www-data用戶的deploy-key(為什么要給www-data用戶生成key瓷患,因為在本地提交代碼時骡尽,github會請求服務器的php文件從而同步服務器代碼)
。
這時候報錯
報錯.png
報錯原因是無法在目錄下創(chuàng)建目錄以及找不到目錄
原來www目錄屬于root用戶組 權限是rwxr-xr-x
image.png
我們需要進入www目錄創(chuàng)建.ssh目錄后更改目錄用戶權限
chown -R www-data:www-data ./.ssh/
這時候再次執(zhí)行命令 sudo -Hu www-data ssh-keygen -t rsa 擅编,生成deploy-key攀细。將生成的id_rsa.pub文件內容,添加到項目中的 deploy keys中。
打開github上的項目倉庫辨图,給項目添加deploy-key
image.png
2. 在服務器上拉取自己的倉庫(使用ssh方式)
3.建立代碼同步的deploy.php
在倉庫根目錄下建立deploy.php文件
<?php
@file_put_contents('./req.log',json_encode($_POST).PHP_EOL, FILE_APPEND|LOCK_EX);
class Deployment {
public $serect = 'zjh19971010.'; //自定義的webhooks中配置的密鑰
public function deploy()
{
$requestBody = file_get_contents('php://input'); //每次推送的時候班套,會接收到post過來的數(shù)據。
$payload = json_decode($requestBody, true); //將數(shù)據轉成數(shù)組故河,方便取值吱韭。
if(empty($payload)){
//寫日志
$this->write_log('send fail from github is empty');exit;
}else{
//獲取github推送代碼時經過哈希加密密鑰的值
$signature = $_SERVER['HTTP_X_HUB_SIGNATURE'];
}
if (strlen($signature) > 8 && $this->isFromGithub($requestBody,$signature)) {
//驗證密鑰是否正確,如果正確執(zhí)行命令鱼的。
$res = shell_exec("cd /var/www/html/ball_mation/ball_mation/ &&
git pull 2>&1"); // 項目目錄
$res_log = "\n -------------------------".PHP_EOL;
$res_log .= '['.$payload['commits'][0]['author']['name'] . ']' . '向[' . $payload['repository']['name'] . ']項目的' . $payload['ref'] . '分支'.$_SERVER['X-GitHub-Event'].'了代碼理盆。commit信息是:'.$payload['commits']['message'].'。詳細信息如下:' . PHP_EOL;
$res_log .= $res.PHP_EOL;
http_response_code(200);
$this->write_log($res_log);
}else{
$this->write_log('git 提交失敶战住猿规!');
abort(403);
}
}
public function isFromGithub($payload,$signature)
{
//$hash是github的密鑰。然后與本地的密鑰做對比宙橱。
list($algo, $hash) = explode("=", $signature, 2);
return $hash === hash_hmac($algo, $payload, $this->serect);
}
public function write_log($data)
{
// 此處加載日志類姨俩,用來記錄git push信息,可以自行寫师郑。
file_put_contents('./push_push.log', $data.PHP_EOL, FILE_APPEND|LOCK_EX);
}
}
$deploy = new Deployment();
if($_SERVER['REQUEST_METHOD'] == 'POST'){
//觸發(fā)此代碼的時候环葵,git是以post方式觸發(fā)
$signature = $deploy->deploy();
}
代碼中的$serect
跟shell_exec()
函數(shù)中的項目路徑需要更改為自己的
4.設置倉庫的webhooks
image.png
填寫自己的serect跟deploy.php訪問url即可,傳輸方式選擇json
image.png
5.本地測試
拉取倉庫代碼在本地修改提交后宝冕,檢查服務器代碼是否同步张遭,若同步即為成功