Github同步网站,网站自动部署
文章目录
我只是用来备份我博客,并自动部署到我服务器上,也就是家里的N1盒子.
没用过啥Github,毕竟不是科班出身,也没在公司干过..
新建一个私有仓库
随便建,反正别人也看不到
设置webhook
下面有选项, 什么时候触发.
我设置的push的时候触发,也就是我向仓库提交代码的时候触发.
服务器环境部署
web代码
也就是webhooks访问的页面,我这里是PHP,然后通过PHP执行shell .拉取更新的代码
public function go()
{
// webhook上设置的secret
$secret = "*************"; //key
// 校验发送位置,正确的情况下自动拉取代码,实现自动部署
$signature = Request::server("HTTP_X_HUB_SIGNATURE");
if(!empty($signature)) {
$hash = "sha1=".hash_hmac('sha1', file_get_contents("php://input"), $secret);
if (strcmp($signature, $hash) == 0) {
set_time_limit(3 * 60); //最大过期时间3分钟
$shellPath = "/data";
$cmd = "bash /data/git_pull_web.sh";
$res = $this -> doShell($cmd);
//print_r($res); // 主要打印结果给github记录查看,自己测试时查看
return json($res);
}
}else{
abort(404, '页面异常');
}
}
/*
* 执行shell命令
*/
protected function doShell ($cmd, $cwd = null) {
$descriptorspec = array(
0 => array("pipe", "r"), // stdin
1 => array("pipe", "w"), // stdout
2 => array("pipe", "w"), // stderr
);
$proc = proc_open($cmd, $descriptorspec, $pipes, $cwd, null);
// $proc为false,表明命令执行失败
if ($proc == false) {
return false;
// do sth with HTTP response
print_r("命令执行出错!");
} else {
$stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
fclose($pipes[2]);
$status = proc_close($proc); // 释放proc
}
$data = array(
'stdout' => $stdout, // 标准输出
'stderr' => $stderr, // 错误输出
'retval' => $status, // 返回值
);
return $data;
}
shell脚本
cd /data/www/yakeblog
git fetch --all
git reset --hard origin/master
git pull
composer install
自己拉取的脚本测试下.
私有项目拉取有两种方式,1是账号密码,2是生成一个ssh密钥,把公钥传GitHub 个人设置里面
不香的地方
webhooks经常超时.