Настройка PHP Subversion FTP - PullRequest
3 голосов
/ 23 мая 2009

Я работаю в небольшом php-магазине и недавно предложил отказаться от использования нашего nas в качестве базы общего кода и начать использовать subversion для контроля версий.

Я выяснил, как сделать так, чтобы наш сервер dev обновлялся при каждом коммите в нашу ветку разработки ... и я знаю, как слиться в магистраль и как обновить наш промежуточный сервер, потому что у нас есть прямой доступ к обоим из них, но мой самый большой вопрос - как написать скрипт, который будет обновлять рабочий сервер, к которому у нас много раз есть только доступ по ftp. Я не хочу загружать весь сайт каждый раз ... есть ли способ написать сценарий, который достаточно умен, чтобы загружать только то, что изменилось на веб-сервере, когда мы его выполняем (не хочу, чтобы он автоматически выгрузка в производственную среду, мы хотим выполнить ее вручную)?

Мой вопрос вообще имеет смысл?

Ответы [ 7 ]

4 голосов
/ 23 мая 2009

По сути, ваша проблема в том, что вы не можете использовать Subversion на рабочем сервере. Что вам нужно сделать, это сохранить на отдельном (идеально идентично настроенном) сервере копию вашей производственной проверки и скопировать ее любым другим способом на рабочий сервер. На самом деле вы могли бы думать об этом как о своем промежуточном сервере, так как он также будет полезен для выполнения окончательных тестов релизов перед их развертыванием.

Что касается копии, если ваш провайдер поддерживает rsync, все готово. Если у вас есть только FTP, вам нужно будет найти какой-нибудь способ сделать rsync через FTP. Это не первый раз, когда у кого-то есть такая потребность; веб-поиск поможет вам там. Но если ты ничего не можешь найти, напиши мне записку, и я осмотрюсь вокруг себя немного дальше.

РЕДАКТИРОВАТЬ: Надеюсь, автор не против того, чтобы я добавил это, но я думаю, что это относится к этому. Чтобы сделать что-то похожее на rsync с ftp, посмотрите на weex http://weex.sourceforge.net/. Это оболочка командной строки ftp, которая использует локальное зеркало для отслеживания того, что находится на удаленном сервере, чтобы он мог отправлять только измененные файлы. Прекрасно работает для меня.

1 голос
/ 23 мая 2009

Я использую следующее решение. Просто установите клиент SVN на свой веб-сервер и прикрепите его к приватно доступной ссылке:

<code> <?php

    // make sure you have a robot account that can't commit ;) 
    $username = Settings::Load()->Get('svn', 'username');
    $password = Settings::Load()->Get('svn', 'password');
    $repos = Settings::Load()->Get('svn', 'repository');

    echo '<h1>updating from svn</h1><pre>';
    // for secutity, define an array of folders that you do want to be synced from svn. The rest should be skipped.
    $svnfolders = array(    'includes/' ,'plugins/' ,'images/' ,'templates/', 'index.php' => 'index.php');

    if(!empty($_GET['justthisone']) && array_search($_GET['justthisone'], $svnfolders) !== false){ // you can also just update one of above by passing it to $_GET
        $svnfiles = array($_GET['justthisone']);
    }

    foreach($svnfiles as $targetlocation)
    {   
        echo system("svn export --username={$username} --password {$password} {$repos}{$targetlocation} ".dirname(__FILE__)."/../{$targetlocation} --force");
    }

    die("

Выполнено

! ");
1 голос
/ 23 мая 2009

Это не похоже на SVN хорошо работает с FTP, но если у вас есть доступ по http, этого может оказаться достаточно для отправки изменений с использованием svnsync . Вот как мы вносим изменения в наши производственные серверы - мы используем svnsync, чтобы сохранить доступное только для чтения зеркало хранилища.

0 голосов
/ 26 января 2013

Я думаю, это поможет вам

https://github.com/midhundevasia/deploy

хорошо работает в Windows.

0 голосов
/ 23 мая 2009

Просто идея:

Вы можете хранить ревизию вашего проекта на хосте, к которому у вас есть доступ и где установлена ​​Subversion. Эта единственная редакция отражает версию производственного сервера. Теперь вы можете написать PHP-скрипт, который обновляет репозиторий через SVN, а затем найти все файлы, которые были изменены с момента обновления репутации. Эти файлы вы можете загрузить.

Такой скрипт может выглядеть так:

$path = realpath( '/path/to/production/mirror' );
chdir( $path );

$start = time();
shell_exec( 'svn co' );

$list = array();
$i = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $path ), RecursiveIteratorIterator::SELF_FIRST );

foreach( $i as $node )
{

    if ( $node->isFile() && $node->getCTime() > $start )
    {

        $list[] = $node->getPathname();

    } 

    // directories should also be handled

}

$conn = ftp_connect( ... );

// and so on

Так же, как мне пришло в голову.

0 голосов
/ 23 мая 2009

LFTP способен синхронизировать каталоги по ftp.

0 голосов
/ 23 мая 2009

Я собираюсь сделать предположение здесь и сказать, что вы используете хук post-commit для выполнения слияния / обновления вашего промежуточного сервера. Это может сработать, но я настоятельно рекомендую вам рассмотреть решение Continuous Integration . Вот некоторые из них, о которых я знаю:

  1. Xinc - http://code.google.com/p/xinc/ (специфично для PHP)
  2. CruiseControl - http://cruisecontrol.sourceforge.net/ (Безумно популярен.) Интеграция PHP стала возможной с http://phpundercontrol.org/about.html
  3. Гудзон - [https://hudson.dev.java.net/] (похоже, основан на Java, но допускает плагины / расширения)
...