使用PHP脚本作为提交后挂钩,触发bash脚本,进行git-pull?

时间:2012-03-04 09:04:21

标签: php git bash github ssh-keys

这是bash脚本:

#!/bin/bash

echo "$NODE_ENV"
(
echo $USER;
echo $PATH;
cd /opt/chat-staging/;
git pull;
NODE_ENV=staging;
echo "Set NODE_ENV to $NODE_ENV";
node leaderboard.js & node app.js;
echo "Started leaderboard.js";
echo "Started app.js";
)
echo "NODE_ENV is now $NODE_ENV"

这是PHP脚本:

<?php

exec('/bin/bash /opt/chat-staging/start_app.sh 2>&1', &$output, &$return_var);
print_r($output);
print $return_var;

?>

我把它设置为github post-commit钩子,但这是输出:

  

数组([0] =&gt; [1] =&gt; www-data [2] =&gt; / usr / bin [3] =&gt;   / usr / lib / git-core / git-sh-setup:90:sed:not found [4] =&gt;基本名称:   写入错误:管道损坏[5] =&gt; / usr / lib / git-core / git-sh-setup:212:   uname:未找到[6] =&gt;主机密钥验证失败。 [7] =&gt;致命:   远程端意外挂断[8] =&gt;将NODE_ENV设置为分段[9]   =&GT; /opt/chat-staging/start_app.sh:line 11:node:command not found [10] =&gt; /opt/chat-staging/start_app.sh:line 11:node:command not   发现[11] =&gt;已启动leaderboard.js [12] =&gt;已开始app.js [13] =&gt;   NODE_ENV现在是0

/ opt / chat-staging /归“www-pub”所有;在/ etc / groups中,我有“www-pub:x:1000:www-data,root”。

那为什么这不起作用?我甚至在/var/www/.ssh/id_rsa中有一个RSA密钥,并且公钥作为GitHub部署密钥添加。

编辑,附录

我添加了一个git remote-v;在“git pull”之前的剧本。

root@li70-243:/opt/chat-staging# su - www-data
$ bash /opt/chat-staging/start_app.sh
origin  git@github.com:zackster/CompassionPit--Node-.git (fetch)
origin  git@github.com:zackster/CompassionPit--Node-.git (push)
Already up-to-date.

然而我仍然看到PHP输出像......

  

数组([0] =&gt;来源git@github.com:zackster/CompassionPit - Node-.git   (获取)[1] =&gt; origin git@github.com:zackster/CompassionPit - Node-.git   (推)[2] =&gt; master [3] =&gt; *声誉[4] =&gt;   / usr / lib / git-core / git-sh-setup:90:sed:not found [5] =&gt;基本名称:   写入错误:管道损坏[6] =&gt; / usr / lib / git-core / git-sh-setup:212:   uname:未找到[7] =&gt; / usr / lib / git-core / git-pull:244:sed:not   发现[8] =&gt;您的配置指定与ref合并   '声誉'[9] =&gt;来自遥控器,但没有提到这样的参考。

1 个答案:

答案 0 :(得分:4)

您的PHP脚本似乎运行正常。什么不是“正常工作”是exec()。您希望将PATH环境变量设置为常规shell用户设置的任何值。它不是。您需要为bash脚本(以及其中的工具)设置环境。

您的 shell中执行echo $PATH并将其添加到您的执行人员中:

exec('export PATH=/usr/bin:/usr/local/bin:/some/other/paths && /bin/bash /opt/chat-staging/start_app.sh 2>&1', &$output, &$return_var);

再次尝试使用您的脚本。您还可以将PATH移动到shell脚本中。你甚至可以复制你的 .bashrc(或.bash_profile或其他)并用source …/.bashrc加载它。

而不是exec()您还可以查看proc_open(),您可以更好地控制要执行的流程。


github解释了如何挂钩发布接收事件:http://help.github.com/post-receive-hooks/