介绍使用git的webhook功能 自动更新php项目代码 以及遇到的坑
发布者:admin 发表于:438天前 阅读数:2579 评论:0

作为一名php爱好者,最近在部署项目时想尝试下用git自动部署的方案。以往用手动发包更新的方式实在太落伍了。

借着git的热度,本人发现git提供webhook的方式可以在服务器上直接拉取代码实现更新,决定一试。

首先编写一个简单webhook.php的文件放在网站的根目录用来被git网站请求。代码如下:

$cmd = "cd /usr/share/path && git pull &&  echo 'success' ";  //关键命令 /usr/share/path为项目仓库目录
echo shell_exec('php -v') ."<br>";  //用来测试exec命令是否有权限执行
echo shell_exec('whoami') ."<br>";  //用来查看当前执行者得用户名称
var_dump(shell_exec($cmd)); //返回成功还是null

可以被git访问的地址假设为http://www.aaa.com/webhook.php

然后用ssh使用root账号登录服务器,在网站目录下执行cli 命令php webhook.php 成功完成了git的代码拉去更新,此root账号已配置过git公钥。

接着用浏览器方式访问网站地址 /webhook.php文件,这时var_dump返回结果为null,很明显没有执行成功,执行exec结果:

  • 判断php.ini中是否禁用了exec 等命令,这里没有禁用exec,因此忽略这条
  • 网站环境使用centos7 nginx+php-fpm +php.7.2 的配置,使用 ps aux | grep php查看php-fpm的用户为apache。在php-fpm 下www.conf中发现 指定的group 和user 都为 apache

因此编辑 vim etc/sudoer这个文件。目的是给apache用户的最大的执行权限

#Allow root to run any commands anywhere 
root    ALL=(ALL)   ALL
apache  ALL=(ALL)   ALL   //找到这行 后添加apache用户

完成了上述检查后 本人再次用浏览器访问网站地址 /webhook.php文件,仍然返回null。 惊奇到怀疑人生。

于是乎本人去掉了命令中的 git pull 这行,然后执行程序,发现成功返回了信息。 因此判断 是apache用户没有git权限导致,拉取失败。

由于apache用户是系统为进程创建的用户 无法直接登录, 所以无法直接使用apache登录并创建ssh密钥,切换apache账号时会提示 This accountis currently not available.

因此本人改变思路,将root下.ssh目录复制到本地,此目录下密钥之前已配置成功,然后查看 /etc/passwd 文件 ,发现了这行 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

也就是说apache的用默认路径是/usr/share/httpd目录, 所以把本地.ssh文件上传到该目录下使该apache用户也有权限访问git。最后使用浏览器访问webhook.php,提示成功!大功告成

另外值得一提: 网站项目中.git 目录下的FETCH_HEAD 文件 需要给apache用户读写权限,否则也会因为权限不足而报错。

本文原创于www.7php.cn