Hexo使用记录(三):GitHub项目同步更新至指定服务器

前言:

如果我们需要把项目部署到自己的服务器上面,那么在使用GitHub的时候,每次push代码后,要手动到服务器上git putt一下。为了省时省力我们可以编写一个脚本实现自动部署。使用GitHub上的webhook功能就能实现此功能。

我的服务器是CentOS7.6,Php是7.2,如不需要部署,则可直接进行下一篇文章。

配置ssh key:

执行ssh-keygen,一路回车就可以,之后在/home/www/.ssh/hui会生成id_rsa和id_rsa.pud两个文件,cat id_rsa.pud 查看id_rsa.pud文件内容并复制。

登录至GitHub,依次点击Settings,SSH and GPG keys,New SSh Key。将复制的内容添加到 Key 中, Title 可以自己随意设定,最后点击 Add SSH Key。回到服务器shell界面,输入 ssh -T git@github.com 验证是否添加成功。

1
Hi OldManXie! You've successfully authenticated, but GitHub does not provide shell access.

配置Webhook:

登录到GitHub,进入你的仓库,依次点击Settings,Webhook。

填写Payload URL,这是即将编写的脚本所放的地方,必须要在公网可以访问。

Content type,数据类型,选择你所熟悉的,我这里选择的是application/json格式。

Secret,这个是密码,为了安全起见,有必要填写一下,当然你就不想写也是可以的。

Which events would you like to trigger this webhook?,触发事件,我选择Just the push event.只是push的时候触发。

然后点击添加就可以了。

image-20200403112741342

编写Php脚本:

这个脚本用什么语言写都是一样的,因为我熟悉并且服务器搭建的就是Php,所以就用Php了,因为7.0不支持$HTTP_RAW_POST_DATA了,所以选择相应的版本。

Php > 7.0脚本如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
//需要和你在Github上填写的secret一致
$secret = "";
// 需要同步的项目路径
$path =
$signature = $_SERVER['HTTP_X_HUB_SIGNATURE'];
if ($signature) {
$hash = "sha1=".hash_hmac('sha1', file_get_contents("php://input"), $secret);
if (strcmp($signature, $hash) == 0) {
//shell_exec 执行shell命令,2>&1用于标准错误重定向到标准输出,也就是脚本执行错误时也能返回错误信
echo shell_exec("cd {$path} && /usr/bin/git reset --hard origin/master && /usr/bin/git clean -f && /usr/bin/git pull 2>&1");
exit();
}
}
http_response_code(404);
?>

Php < 7.0脚本如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
//需要和你在Github上填写的secret一致
$secret = "";
// 需要同步的项目路径
$path = "";
$signature = $_SERVER['HTTP_X_HUB_SIGNATURE'];
if ($signature) {
$hash = "sha1=".hash_hmac('sha1', $HTTP_RAW_POST_DATA, $secret);
if (strcmp($signature, $hash) == 0) {
//shell_exec执行shell命令,2>&1用于标准错误重定向到标准输出,也就是脚本执行错误时也能返回错误信息
echo shell_exec("cd {$path} && /usr/bin/git reset --hard origin/master && /usr/bin/git clean -f && /usr/bin/git pull 2>&1");
exit();
}
}
http_response_code(404);
?>

把你的脚本放在之前GItHub上面配置的地方即可。

服务器配置:

进入到我们想要存放项目的目录后,GIt初始化,然后添加远程仓库映射,指定想要pull的远程分支,指定默认主机。

1
2
3
4
5
6
$ mkdir hexo.sbblog.top //创建文件夹
$ cd hexo.sbblog.top //进入文件夹
$ git init //初始化Git
$ git remote add origin https://github.com/OldManXie/OldManXie.github.io.git //远程仓库映射
$ git push -u origin master //指定默认主机,验证身份信息,不指定的话每次pull都要指定分支,很麻烦
$ chmod -R 777 .git/ //给用户Git权限