2009-05-23 15 views
3

私は小さなPHPの店で働いています。私は最近、私たちが共有コードベースとして私たちのNASを使い、ソース管理のためにSubversionの使用を開始することを提案しました。PHP SubversionのセットアップFTP

開発ブランチにコミットするたびに私たちのdevサーバーが更新されるようにする方法を知りました...そして私はトランクにマージする方法を知っていて、ステージングサーバーを更新しています。私の最大の問題は、プロダクションサーバをアップデートするスクリプトを書く方法です。プロダクションサーバは、たいていftpアクセスしか持っていません。毎回サイト全体をアップロードしたくありません。私たちが実行するときにWebサーバーに変更されたものだけをアップロードするのに十分なスマートなスクリプトを書く方法はありますか?本番環境にアップロードするには、手動で実行したい)

私の質問は理にかなっていますか?

答えて

4

基本的に、プロダクションサーバーではSubversionを使用できないという問題があります。あなたがする必要があるのは、別個の(理想的には同じように構成された)サーバー上に本番のチェックアウトのコピーを保管し、それをどのような方法で本番サーバーにコピーするかです。これをあなたのステージングサーバーと考えることができます。実際には、それらを展開する前にリリースの最終テストを行うのにも便利です。

あなたのプロバイダがrsyncをサポートしている限り、コピーが行われる限り、あなたは設定されています。 FTPだけを持っているなら、rsyncに相当するFTPを使って何らかの方法を見つけなければなりません。誰にでも必要なのは初めてのことではありません。ウェブ検索があなたを助けます。しかし、あなたが何かを見つけることができない場合は、私にメモを落として、私はもう少し自分の周りを見回します。

編集:私がこれを追加しても構わないと思っていますが、私はそれがここに属していると思います。 ftpでrsyncに似た何かをするにはweex http://weex.sourceforge.net/を見てください。ローカルミラーを使用してリモートサーバー上のファイルを追跡し、変更されたファイルのみを送信できるようにするコマンドラインftpのラッパーです。私にとって素晴らしい作品です。

+0

特に編集のおかげで...私は転覆で働いていたものを探していましたが、私はちょうどftpで同期する何かが必要だと思います...良い点、ありがとう! – Boushley

+0

ベン、あなたがそれを追加してくれてとても嬉しく思っています。 –

1

doesn't sound like SVNはFTPでうまくいきますが、httpアクセス権を持っている場合は、svnsyncを使用して変更をプッシュするのに十分かもしれません。それが我々の生産サーバに変更を加える方法です - 私たちはsvnsyncを使って、リポジトリの読み取り専用ミラーを利用可能にします。

+0

サーバがサブバージョンを実行していない場合はどうなりますか? – Boushley

0

ここでは、ステージングサーバーのマージ/アップデートを行うためにコミット後のフックを使用していると仮定します。これはうまくいくかもしれませんが、私はあなたがContinuous Integrationソリューションを調べることを強くお勧めします。以下の私が知っているいくつかある:(大人気)

  1. XINC - http://phpundercontrol.org/about.html
  2. ハドソンを可能にしたhttp://cruisecontrol.sourceforge.net/ PHPの統合 - - (具体的なPHP)http://code.google.com/p/xinc/
  3. CruiseControlの[https://hudson.dev.java.net/]は(登場Javaをベースにしていますが、プラグイン/拡張機能を使用できます)
+0

私が設定したポストコミットツールよりこれらのツールの1つを使用する利点はありますか? – Boushley

0

LFTPは、ftpでディレクトリを同期することができます。

1

私は以下の解決策を使用します。ちょうどあなたのウェブサーバ上のSVNクライアントをインストールし、個人的にアクセスできるURLにこれを添付:

<?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("</pre><h1>Done!</h1>"); 
+3

http://www.php.net/escapeshellarg – troelskn

0

ジャストアイデア:あなたはどこにしてアクセス権を持つホスト上で、プロジェクトのリビジョンを保持することができ

Subversionがインストールされています。この単一のリビジョンは、運用サーバーのバージョンを反映します。 これでリポジトリをsvnで更新し、更新が更新されてから変更されたすべてのファイルを見つけるPHPスクリプトを書くことができました。これらのファイルはアップロードできます。

このようなスクリプトは次のようになります。

$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

自動的に何かを見つけることができない場合、これは素晴らしいことです!ありがとう、トン! – Boushley

関連する問題