LINUX.ORG.RU

Автоматический деплой на сервер с bitbucket

 , , ,


1

1

Добрый вечер!

Настраиваю деплой, всякие ssh ключи и прочее. Не до конца получается. Сервер debian Нужно чтобы команда git pull могла выполняться от пользователя www-data (т.е. bitbucket дёргает php страницу с командой exec('git pull');)

До чего дошёл: Открываю консоль, от имени www-data генерирую ключи, запускаю ssh-agent, добавляю ключи, добавляю публичный ключ в аккаунт на bitbucket, делаю git pull - всё работает, всё хорошо.

Если повторно подключиться - нужно снова запускать ssh-agent и делать ssh-add, только тогда работает.

Вроде бы чтобы при авторизации запускался ssh-agent, нужно прописать это в .bash_profile, но мне нужно не только из консоли чтобы работало, но и просто при выполнении php.


делай пуш на сервер, вместо pull с сервера.

git умеет это с некоторых пор.

https://github.com/blog/1994-git-2-4-atomic-pushes-push-to-deploy-and-more

Git 2.4 improves push-to-deploy in two ways:

There is now a push-to-checkout hook, which can be installed on the server to customize exactly what happens when a user pushes to the checked-out branch. For example, by default such a push fails if there have been any changes to the working tree on the server. The push-to-checkout hook could instead try to merge any server-side edits with the new branch contents, or it could unconditionally overwrite any local changes with a pristine copy of the pushed branch contents. [source]

Push-to-deploy formerly didn't work correctly when pushing to a server that is on an «unborn branch». (An «unborn branch» is what Git calls a branch that doesn't yet have any commits on it, as for example immediately after a Git repository is initialized.) Now this works as expected, which will hopefully reduce confusion for users who are trying to set up push-to-deploy for a new project. [source]

waker ★★★★★ ()
Последнее исправление: waker (всего исправлений: 1)
Ответ на: комментарий от leave

Точно, сгенерировал ключ без пароля - всё в консоле заработало. Спасибо

Из php так же не работает, как и прежде.

var_dump($output);
$output = '';
exec('git reset --hard HEAD', $output);
var_dump($output);
$output = '';
exec('git pull origin master', $output);
var_dump($output);
Этот код выполняет правильно git reset, но git pull не выводит ничего и никаких изменений.

z-17 ()
Ответ на: комментарий от waker

Это круто, но хотелось бы сначала понять что я делаю не так в способе через git pull

z-17 ()

Я бы создал отдельного пользователя deployer и от www-data запускал бы этот скрипт через sudo. В скрипте первая строчка export PATH такой же как в терминале. Далее нужно как-то сделать, чтобы этот скрипт форкался и работал в качестве демона, сразу же вернув управление запустившему его коду www-data. Кроме этого нужно как-то делать lock, чтобы несколько скриптов не начали работать параллельно. Форк и блокировку наверняка можно делать по разному, да и гуглится это на раз, поэтому без подробностей. Скрипт должен быть без параметров, потому что авторизован на его выполнение будет любой, кто сможет выполнить код под www-data. ssh ключ без пароля (защищен только правами на файловой системе).

prefetch ()
Ответ на: комментарий от prefetch

Может быть так было бы правильнее, но для начала мне хочется понять почему у меня не выполняется самое простое - git pull в php скрипте.

z-17 ()

upd: ошибка, которая возникает при exec('git pull'); Host key verification failed. fatal: The remote end hung up unexpectedly

При этом из консоли от пользователя www-data этой ошибки нет, всё работает

z-17 ()
Ответ на: комментарий от z-17

Вот поэтому, я и предложил написать отдельный скрипт для отдельного пользователя со всем содержимым PATH (и, возможно, другими переменными окружения), потому что его выполнение из php и из консоли будет мало отличаться (т.е. с большой вероятностью этот косяк просто не возникнет).

prefetch ()
Ответ на: комментарий от KRoN73

Из терминала:

TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/bin/bash
LOGNAME=www-data
USER=www-data
USERNAME=www-data
MAIL=/var/mail/www-data
HOME=/var/www
SUDO_COMMAND=/usr/bin/env
SUDO_USER=root
SUDO_UID=0
SUDO_GID=0

Из PHP:

APACHE_RUN_DIR=/var/run/apache2
APACHE_PID_FILE=/var/run/apache2.pid
PATH=/usr/local/bin:/usr/bin:/bin
APACHE_LOCK_DIR=/var/lock/apache2
LANG=C
APACHE_RUN_USER=www-data
APACHE_RUN_GROUP=www-data
APACHE_LOG_DIR=/var/log/apache2
PWD=/var/www/user/data/www/develop/site/www

Добавление APACHE_HOME в envvars не помогло

z-17 ()
Ответ на: комментарий от z-17

Чёрт! Сделал из php команду whoami и увидел что пользователь не www-data, а user. Сделал ключи для него и всё такое - и всё заработало.

Всем больше спасибо. А я слишком сильно тупил(

z-17 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.