Развертывание PHP-проекта из Git на сервере, на котором не установлен Git
Мне нужно найти способ развертывания PHP-проекта, хранящегося в репозитории git, на промежуточном и производственном сервере, на котором не установлен git. Сценарии, которые я нашел до сих пор (например, Capistrano), требуют Git на целевом сервере.
К сожалению, мой хост этого не разрешает, и пока единственный способ - через стандартный FTP, с помощью которого я сохраняю отсутствующие файлы. Это создает непрофессиональный вид.
Я хотел бы иметь возможность развертываться из моего локального репозитория git, который будет проверять в папке .git на целевом сервере, чтобы узнать, какая версия там, затем заставьте целевой сервер создать резервную копию текущей версии, а затем перезаписать ее, отправив только измененные файлы.
Предпочтительно что-нибудь на PHP с веб-интерфейсом.
Я не прошу многого;)
Кто-нибудь там видел/видел что-нибудь подобное?
5 answers
Возможно, вы сможете использовать что-то вроде Fuse для "монтирования" производственного сервера в качестве локального диска, а затем, что касается вашей копии git, это локальная операция. В качестве альтернативы, rsync.
Есть инструмент под названием Одуванчик , который также делает это. Из того, что я вижу, он очень похож на git-ftp, НО он также поддерживает sftp и Amazon S3, что удобно, если вы не хотите менять инструмент развертывания только потому, что вы меняете сервер. Он поставляется в виде рубинового драгоценного камня, поэтому его очень легко установить и начать работу.
Я использую Beanstalkapp.com , что здорово. Вы можете выполнить развертывание через FTP или SFTP.
Я сделал что-то подобное, используя ssh2 и php.
Сначала вам нужно клонировать репозиторий на сервере. После клонирования вы можете выполнять git-извлечение, извлечение и т. Д. Из php с помощью ssh2. самым практичным способом, который я нашел, было делать.
git fetch;
git reset --hard commit_hash;
Для того, чтобы установить фиксацию на ожидаемую.
Чтобы выполнить команду php -ssh2 (предположим, у вас установлен ssh2), вы можете использовать этот метод.
public static function SSHCommmand($command,$user,$ip) {
$port = 22;
if (!function_exists("ssh2_connect"))
die("function ssh2_connect doesn't exist.");
$result['debug'] .= " -Connect- 1";
if (!($con = ssh2_connect($ip, $port, array('hostkey' => 'ssh-rsa')) )) {
die("unable to establish connection.");
} else {
// try to authenticate with username root, password secretpassword
if (!(ssh2_auth_pubkey_file($con, $user, '/home/' . $user . '/.ssh/deploy_rsa.pub', '/home/' . $user . '/.ssh/deploy_rsa'/* , 'secret' */))) {
dir("fail: unable to authenticate.");
} else {
// allright, we're in!
// execute a command
if (!($stream = ssh2_exec($con, $command))) {
die("fail: unable to execute command.");
} else {
// collect returning data from command
stream_set_blocking($stream, true);
$data = '';
while ($buf = fread($stream, 4096)) {
$data .= $buf;
}
fclose($stream);
return $data;
}
}
}
}
Я использую ключ ssh-rsa, метод аутентификации может измениться. Я также предполагаю что ключи находятся в '/home/' . $user . '/.ssh/deploy_rsa.pub'
и '/home/' . $user . '/.ssh/deploy_rsa
.
Еще одна вещь, которую вы могли бы принять во внимание, заключается в том, что для удаленного выполнения удаленной команды git команда должна быть такой:
_GIT_PATH.' --git-dir='.$path.'/.git --work-tree='.$path.' '.$command;
Где $path
- верхний уровень рабочего дерева.
Используя это и Api Amazon, я смог развернуть новый код на нескольких серверах автоматически и одновременно.