Использование PHP-скрипта в качестве ловушки после фиксации, для запуска скрипта bash, для выполнения git-pull? - PullRequest
1 голос
/ 04 марта 2012

Вот скрипт 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, но это вывод:

Array ([0] => [1] => www-data [2] => / usr / bin [3] => / usr / lib / git-core / git-sh-setup: 90: sed: не найдено [4] => basename: ошибка записи: Broken pipe [5] => / usr / lib / git-core / git-sh-setup: 212: uname: not found [6] => Ошибка проверки ключа хоста. [7] => смертельно: Удаленный конец неожиданно повесил трубку [8] => Установите NODE_ENV в промежуточное состояние [9] => /opt/chat-staging/start_app.sh: строка 11: узел: команда не найдена [10] => /opt/chat-staging/start_app.sh: строка 11: узел: команда не найдена found [11] => Запущен leaderboard.js [12] => Запущен app.js [13] => NODE_ENV сейчас) 0

/ opt / chat-staging / принадлежит "www-pub"; в / etc / groups у меня есть "www-pub: x: 1000: www-data, root".

Так почему это не работает? У меня даже есть ключ RSA в /var/www/.ssh/id_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 вроде ...

Array ([0] => origin git@github.com: zackster / CompassionPit - Node-.git (выборка) [1] => origin git@github.com: zackster / CompassionPit - Node-.git (нажать) [2] => мастер [3] => * репутация [4] => / usr / lib / git-core / git-sh-setup: 90: sed: не найдено [5] => basename: ошибка записи: Broken pipe [6] => / usr / lib / git-core / git-sh-setup: 212: uname: не найдено [7] => / usr / lib / git-core / git-pull: 244: sed: не found [8] => Ваша конфигурация указывает на слияние с реф 'reputation' [9] => с пульта, но такой ссылки не было получено.

1 Ответ

4 голосов
/ 04 марта 2012

Ваш скрипт PHP работает нормально. То, что не «работает нормально», это exec(). Вы ожидаете, что переменная окружения PATH будет установлена ​​на то, что установил ваш обычный пользователь оболочки. Это не. Вам необходимо настроить среду для работы скрипта bash (и инструментов в нем).

do echo $PATH в вашей оболочке и добавьте это в ваш exec:

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 в свой скрипт оболочки. Вы даже можете скопировать ваш .bashrc (или .bash_profile или любой другой) и загрузить его с помощью source …/.bashrc.

вместо exec() вы также можете заглянуть в proc_open () , с помощью которого вы можете гораздо больше контролировать процесс, который нужно выполнить.


github объясняет, как подключиться к событиям приема сообщений: http://help.github.com/post-receive-hooks/

...