我在我的github存储库中创建了一个webhook,它在我的实时服务器上的hook url上发布,用于运行pull命令来更新服务器上的repo文件。
问题是我创建的钩子文件位于/var/www/site/web/hookfile.php(帖子请求就在那里。我也得到身体反应)
我的repo文件位于/ var / www / git-repo /
当我向github存储库推送任何内容时,它不会更新git-repo。 我使用终端及其工作来运行此命令。
cd /var/www/git-repo && git pull
但是通过我的php文件它无法正常工作
shell_exec('cd /var/www/git-repo && git pull')
答案 0 :(得分:9)
shell_exec()以静默方式失败,因为只报告STDOUT而不报告STDERR。
尝试:
echo shell_exec("cd /var/www/git-repo && /full/path/to/bin/git pull 2>&1");
通常是权限错误,可以修复为执行php的用户添加权限(apache?)
chown -R www-agent:www-agent repository/
但也可能是远程存储库的连接错误(身份验证,ssh-keys,...)。
答案 1 :(得分:1)
我首先在你的php文件中运行针对你的服务器实例的测试,以便在屏幕上输出任何错误消息,因为exec()系列函数只是静默失败而只报告STDOUT而不报告STDERR:
echo shell_exec("cd /website/root/htdocs && git checkout . && git status 2>&1");
在我的情况下,由于缺少为apache用户定义的二进制路径,因此无法找到git命令。因此,需要为git的二进制文件提供完整路径。它可以通过手动查找或在shell中运行来获得:
'which git'
它返回(进一步称为YOU_FULL_GIT_BINARY_PATH_HERE):
/usr/local/git/bin/git
使用git命令的完整路径,例如'/ usr / local / git / bin / git status'现在很好地运行git命令。
另一件事是确保您的Web服务器用户具有足够的权限来读取/写入您的repo文件夹/文件。我已将我的设置为apache用户所有(Centos 6.8其他版本可能是www:www或www-data:www-data等):
chown -R apache:apache YOUR_WEB_OR_REPO_FODLER
为了确保任何新添加的文件继承正确的权限,运行:
chmod -R g+s YOUR_WEB_OR_REPO_FODLER
上面应该让你的脚本立即运行命令。虽然它没有克服git密码提示,对在YOUR_WEB_OR_REPO_FODLER / .git / config文件中设置的git用户使用'git pull'命令。在repo中运行命令:
git config credential.helper store
command会提示输入密码并让您将其存储在本地。请注意,您存储的密码将不加密,仅受文件系统的保护,例如:在/root/.git-credentials中。这将允许在不提示输入密码的情况下运行'git pull'。
我的全自动持续集成环境按需部署测试VPS并不理想,因为它需要手动输入git user(在repo的.git / config git中定义)密码至少一次。
由于我的环境应始终运行来自远程的origin / master副本的代码,我也在运行
/YOU_FULL_GIT_BINARY_PATH_HERE/git checkout .
在调用'git pull'之前确保任何本地更改永远丢失,或者使用以下方法进行硬重置:
/YOU_FULL_GIT_BINARY_PATH_HERE/git fetch origin
/YOU_FULL_GIT_BINARY_PATH_HERE/git reset --hard origin/master