念念不忘,必有迴響

利用 webhooks 简单快速实现自动部署 PHP 、Laravel 项目

前言

在服务器没有配置项目自动部署的情况下,我们更新代码的普遍流程都是:在本地开发测试完之后往代码仓库推代码 git push ... ,然后登录服务器将刚刚提交的代码给拉下来 git pull ... 以达到我们代码更新的效果。这样反复的操作显得过于繁琐,而使用 webhooks 的目的就是在我们向仓库提交代码的时候,服务器会自动拉取我们刚刚提交的代码来实现自动部署。

关于 webhooks

通常我们开发的代码会存放在类似于github的代码仓库管理平台,以便我们做更好的版本控制。而这样的平台都会提供一个 webhooks 的服务可以让我们项目在发生相关事件时通知外部服务器。刚好我们可以利用这个服务来实现简单的自动部署。

实现

这里以 阿里云code 仓库为例(其他平台大致一样),登录阿里云code后台可以看见使用 webhooks 需要提供一个链接

这个链接/路由由我们自己定义,用于接收push事件的通知,接收到这个通知则进行验证,并执行git pull来更新代码。

file

定义链接/路由与实现方法

// 路由
Route::post('_webhooks','PageController@webhooks');

// 实现方法

public function webhooks(Request $request)
{
    // 先做校验,验证分支 与 身份标识,通过才执行 git pull
    // ......

    // 定义shell 命令 执行 ,这里建议加上 2>&1 便于查看命令执行输出信息
    $shell = "cd " . base_path() . " && sudo git pull 2>&1";
    $exec = shell_exec($shell);
    // 执行其他命令(根据不同需求自定义)
    Artisan::call("config:cache");
    Artisan::call("route:cache");
    Artisan::call("view:cache");
    logger("webhooks shell_exec", compact('shell', 'exec'));
    dump($shell, $exec);
}

添加完之后可以在后台将我们的链接配置好 https://xxx.com/_webhooks

注意!

上面代码是通过 phpshell_exec 函数来实现 git pull 的命令,这里需要留意几个点,不然可能导致命令执行失败。

  • 确保php-fpm所属用户有执行权限
// 查看所属用户
ps aux | grep php-fpm
  • 确保执行用户有生成 ssh key 公钥并且在远程仓库中有添加
ssh-keygen -t rsa -C "xxxxx@gmail.com"
按3个回车,密码为空。
Your identification has been saved in /home/tekkub/.ssh/id_rsa.
Your public key has been saved in /home/tekkub/.ssh/id_rsa.pub.
The key fingerprint is:
………………
最后得到了两个文件:id_rsa和id_rsa.pub

在bash里打 clip < ~/.ssh/id_rsa.pub 可以直接把公钥复制来剪切版,在 仓库 中粘贴即可
  • 如果运行www用户执行命令需要输入密码,可增加www-data 免输密码
// 打开 sudoers文件 增加www-data 免输密码
vim /etc/sudoers 

www-data ALL=(ALL) NOPASSWD: ALL

结语

一般情况下服务器需要自动部署也是在测试环境居多(代码推送频率较高、测试环境需要及时看到效果)。真正的生产环境出于对系统稳定性的考虑,还是不建议用此方法,毕竟我们不会长期处于经常推代码经常上线的状态吧。

实际上现在比较主流的自动部署方案并不是利用webhooks来实现,不过该方案确实对比起像 JenkinsTravis CI 这类 CI 工具用起来方便,当然也是看场景,多服务器多分支多项目另说。后续有时间也可能会记录下
gitlab 的 CI 使用。

-- END

写的不错,赞助一下主机费

扫一扫,用支付宝赞赏
扫一扫,用微信赞赏

暂无评论~~