Использование сценария PHP в качестве хука после фиксации, для запуска сценария bash, для выполнения git-pull?

Вот 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, но это вывод:

Массив ([0] => [1] => www-data [2] => /usr/bin [3] => /usr/lib/git-core/git-sh-setup: 90: sed: не найден [4] => базовое имя: ошибка записи: Broken pipe [5] => /usr/lib/git-core/git-sh-setup: 212: uname: not found [6] => Проверка ключа хоста не удалась [7 ] => fatal: Удаленная сторона неожиданно зависла [8] => Установить NODE_ENV в промежуточную [9] => /opt/chat-staging/start_app.sh: строка 11: узел: команда не найдена [10] => / opt/chat-staging/start_app.sh: строка 11: узел: команда не найдена [11] => Запущена таблица лидеров.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  [email protected]:zackster/CompassionPit--Node-.git (fetch)
origin  [email protected]:zackster/CompassionPit--Node-.git (push)
Already up-to-date.

Принимая во внимание, что я все еще вижу вывод PHP, например...

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


person Zack Burt    schedule 04.03.2012    source источник
comment
Почему вы хотите использовать PHP-скрипт??   -  person knittl    schedule 04.03.2012
comment
/var/www не является домашним каталогом www-pub или www-data, у них их нет в принципе.   -  person greut    schedule 04.03.2012
comment
Отладьте bash-скрипт вручную из консоли - у вас много ошибок во время выполнения   -  person Lazy Badger    schedule 04.03.2012
comment
@knittl, я использую PHP-скрипт, потому что это так просто. Наименьшее количество нажатий клавиш для меня.   -  person Zack Burt    schedule 04.03.2012
comment
@knittl, если вы можете порекомендовать лучшее, более быстрое, умное и безопасное решение - вместо этого я реализую это! Я всегда стремлюсь учиться   -  person Zack Burt    schedule 04.03.2012
comment
@greut Тогда я понятия не имею, зачем я это добавил. Я думаю, что в какой-то момент я видел упоминание о /var/www в выходных данных PHP-скрипта, поэтому я добавил это. Я подозревал, что если это было домашним каталогом, то я мог бы прикрутить туда ключ ssh.   -  person Zack Burt    schedule 04.03.2012
comment
Я не понимаю, почему вы хотите, чтобы сценарий PHP вызывал сценарий bash вместо прямого вызова сценария bash …?   -  person knittl    schedule 04.03.2012
comment
@knittl Могу ли я сделать это из nginx?   -  person Zack Burt    schedule 04.03.2012
comment
@LazyBadger Хорошая мысль, я только что сделал «su www-data» и сейчас пытаюсь его отладить. Но у меня возникла проблема с приглашением PS1, и теперь я решаю проблемы в bash!   -  person Zack Burt    schedule 04.03.2012
comment
@ZacharyBurt: я думал, что речь идет о git-хуках? Они выполняют сценарии оболочки.   -  person knittl    schedule 04.03.2012
comment
@LazyBadger обновил OP тем, что я узнал, запустив скрипт bash от имени пользователя www-data..   -  person Zack Burt    schedule 04.03.2012
comment
@knittl Не знаю, что лучше всего. Я думал, что настроить хук для получения сообщений GitHub было бы хорошо, но если бы я мог сделать это локально, я полагаю, это было бы лучше ... любой способ автоматически «git pull», когда выполняется «git push»?   -  person Zack Burt    schedule 04.03.2012


Ответы (1)


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

выполните 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/

person rodneyrehm    schedule 04.03.2012
comment
exec('export PATH = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games && /bin/bash /opt/chat- staging/start_app.sh 2›&1', &$output, &$return_var); --- теперь выводит массив ( ) 2 - person Zack Burt; 04.03.2012
comment
да, я добавил пробелы там, где их быть не должно. export PATH=/usr/… вместо export PATH = /usr/. - person rodneyrehm; 04.03.2012
comment
Спасибо за вашу помощь, это была очень неприятная проблема! - person Zack Burt; 04.03.2012