假设,我们有三个环境:
- 远程仓库:如Github、GitLab
- 本地仓库:日常开发用的。
- 服务器仓库:一般是自动在测试服务器,或者生产服务器。
Webhooks 实现项目自动部署目的就是:
当有新的本地 git push
到远程仓库时,服务器仓库自动 git pull
新的代码。
一、工作原理
Webhooks工作原理很简单,如下图。
当我们 push
代码到线上仓库,线上仓库必然知道这个 push 操作,远程仓库就会webhooks(回调)我们预留的URL。
而这个URL对应一段后台代码,这段代码执行了git pull
,这样就实现下拉代码操作。
上图是以PHP为例,实际上用Java、Javascrtip等都可以,理论上一行代码就可以搞定。
不过实际稍微复杂一点,需要进行一些安全验证。
二、准备工作
- 这里以 PHP 脚本实现,所以服务器需要 lnmp 环境
- 需要 Git,并配置好 SSH KEY 给远程仓库,请参考这里
三、预测试
写一个 PHP 脚本,并在浏览器下访问代码如下:
<?php
$local = '/home/wwwroot/default/project'; //项目路径
$result = shell_exec("cd {$local} && git pull 2>&1");
echo '<pre>';
var_dump($result);
若浏览器输出 Already up-to-date.
,说明我们脚本能够正确的进行git pull
操作。接下来就与远仓库的 webhooks 对接。
若没有按照以下提示进行处理:
/*
* 这里有几点需要注意:
*
* 1.确保PHP正常执行系统命令。写一个PHP文件,内容:
* <?php var_dump(shell_exec('ls -la'));
* 在通过浏览器访问这个文件,能够输出目录结构说明PHP可以运行系统命令。
*
*
* 2、PHP一般使用www-data或者nginx用户运行,PHP通过脚本执行系统命令也是用这个用户,
* 所以必须确保在该用户家目录(一般是/home/www-data或/home/nginx)下有.ssh目录和
* 一些授权文件,以及git配置文件,如下:
* ```
* + .ssh
* - authorized_keys
* - config
* - id_rsa
* - id_rsa.pub
* - known_hosts
* - .gitconfig
* ```
* 若没有复制一份 cp ~/.ssh/* /home/www/
*
*
* 3.在执行的命令后面加上2>&1可以输出详细信息,确定错误位置
*
*
* 4.git目录权限问题。比如:
* fatal: Unable to create '/data/www/html/awaimai/.git/index.lock': Permission denied
* 那就是PHP用户没有写权限,需要给目录授予权限:
* sudo chown -R www:www /home/wwwroot/default/project
* sudo chmod -R g+s /home/wwwroot/default/project
* sudo chmod -R 775 /home/wwwroot/default/project
*
*
* 5.SSH认证问题。如果是通过SSH认证,有可能提示错误:
* `Could not create directory '/.ssh'.`
* 或者
* `Host key verification failed.`
*/
四、PHP代码
这里我从 Github 上找了一个脚本。
按照说明进行部署即可。
五、测试
以上我们都订阅了push事件。
这样只要我们本地仓库有push命令,都会执行一遍服务器仓库的git pull操作。
相关连接
- https://www.awaimai.com/2203.html,by 歪麦博客
- https://github.com/vicenteguerra/git-deploy,by vicenteguerra