美文网首页我爱编程
Webhooks 实现项目自动部署

Webhooks 实现项目自动部署

作者: guanguans | 来源:发表于2018-05-27 21:13 被阅读68次

假设,我们有三个环境:

  1. 远程仓库:如Github、GitLab
  2. 本地仓库:日常开发用的。
  3. 服务器仓库:一般是自动在测试服务器,或者生产服务器。

Webhooks 实现项目自动部署目的就是:
当有新的本地 git push 到远程仓库时,服务器仓库自动 git pull 新的代码。

一、工作原理

Webhooks工作原理很简单,如下图。

image

当我们 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操作。

相关连接

相关文章

网友评论

    本文标题:Webhooks 实现项目自动部署

    本文链接:https://www.haomeiwen.com/subject/vfdijftx.html