前言
一般情况下,我们每次在使用Github时,每次push
完代码后,都要手动到服务器上git pull
一次,如果是vue之类的项目还要npm i
和npm build
。 当然我们可以写sh脚本来进行部署,但这仍免不了我们要上服务器操作。程序员就是为了懒而生的,我们可以通过Github的webhook功能来实现push
完后直接部署的爽快。
为Apache或Nginx配置用户和组
这里以Apache为例,已经配置了的请绕道。
首先是创建用户和组,在root用户下执行
useradd www
这样会添加www组和www用户,并把www用户放置在www组中。也可以分开创建,自行百度。
创建完用户后会在/home
下创建用户主目录www
,也可以在useradd
后面加上参数-d
指定主目录在其他地方。
找到Apache的配置文件,我的系统为Centos7,默认在/etc/httpd/conf/httpd.conf
。
打开后找到User和Group,更改为www
。
User www
Group www
然后重启Apache systemctl restart httpd
。
修改网站目录拥有者和所属组
找到网站的根目录(不是指某一特定网站,是指整个Apache的网站根目录)。
例如我的目录在/var/www
,在www
文件夹下又有多个站点,我们要把www
文件夹的拥有者改为www,所属组改为www。(确保Apache在执行时有权限)。
chown -R www.www /var/www
cd /var
后,ls -l
,就能看到www
文件夹的拥有者和所属组改变了,然后我们修改一下www
文件夹的权限。
chmod -R 750 /var/www
表示www用户拥有所有权限,同组其他成员不能编辑,其他用户不能访问。
最终结果如下
drwxr-x--- 10 www www 4096 Feb 26 14:06 www
配置ssh key
我们要为用户www也配置ssh key。
首先切换用户为www,然后执行ssh-keygen
。
su www
ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/www/.ssh/id_rsa):
key就放在默认位置就行,密码随意,我没有要密码,因为写脚本会麻烦一丢丢。
这时/home/www/.ssh/
会有id_rsa和id_rsa.pub两个文件,我们还差一个known_hosts文件。
先配置github的ssh key
- 首先
cat id_rsa.pub
,然后复制得到的文本(以ssh-开头)。 - 再打开github,打开个人设置(setting),打开SSH and GPG keys,New SSH key。
- 将复制的文本粘贴进去,再给key取个名字(建议名字包含服务器和用户),Add SSH key。
进入项目文件夹,手动git pull
,这时应该会提示
Are you sure you want to continue connecting (yes/no)?
输入yes
,之后就正常pull了,此时.ssh
文件夹下就自动生成了known_hosts。
编写php脚本
不用php当然也行,用java写个web程序都行,只要能保证能被外网访问到。
<?php
echo "开始部署<br>";
chdir("/var/www/blog/usr/themes/handsome");
exec("git pull 2>&1", $out);
foreach($out as $v)
{
echo iconv( 'GB2312','UTF-8', $v)."<br>";
}
?>
脚本很简单
chdir
切换目录exec
执行shell命令2>&1
用于标准错误重定向到标准输出,也就是脚本执行错误时也能返回错误信息$out
得到命令执行结果并通过echo
输出(因为结果为多行时,用数组保存)
布置好脚本后访问一下
成功啦!然后就设置项目仓库的webhook。
github上打开项目仓库,Setting - Webhooks - Add webhook。
- Payload URL就填写访问php脚本的地址
- Secret为Github请求脚本时发送的密码信息,用于校验
填写好后Add webhook就行了。
使用Secret让脚本更安全
脚本就这样放着肯定不行,如果被人知道了URL,那么谁都可以调用这个脚本了。所以Github提供了校验的方法。
先更改Webhook的Secret为任意密码。
然后修改PHP脚本
<?php
//密钥
$secret = "123456";//Github项目中对应的Secret
//获取GitHub发送的内容
$json = file_get_contents('php://input');
$content = json_decode($json, true);
//github发送过来的签名
$signature = $_SERVER['HTTP_X_HUB_SIGNATURE'];
if (!$signature) {
return http_response_code(404);
}
list($algo, $hash) = explode('=', $signature, 2);
//计算签名
$payloadHash = hash_hmac($algo, $json, $secret);
if ($hash !== $payloadHash){
return http_response_code(404);
}
echo "开始部署<br>";
chdir("/var/www/blog/usr/themes/handsome");
exec("git pull 2>&1", $out);
foreach($out as $v)
{
echo iconv( 'GB2312','UTF-8', $v)."<br>";
}
?>
此时再访问脚本URL,已经报404错误了,随意修改点内容然后push
一下,服务端成功修改则证明脚本正常。
本文为选摘文章,版权归 Sakuradon 所有,转载请注明出处!
本文链接:https://quchao.net/GithubWebhook.html
友情提示:如果博客部分链接出现404,请留言或者联系博主修复。
朋友 交换链接吗
暂时不交换了 谢谢
ok