0

だから私はSVNを私たちのウェブサーバーにインストールしています。アイデアは、作業コピーが開発者のマシンにロードされ、それらがコミットする(競合する)ときに、サーバーがコミット後のbashを実行するというものです。

リポジトリはプロジェクトごとに基づいています。コミット後、bashファイルはプロジェクトフォルダとファイル全体を強制的に削除し、更新されたリポジトリをプロジェクトフォルダにエクスポートして、SVN経由でWebサイトを更新し続ける必要があるという考え方です...この方法にはいくつかの意見の相違があることはわかっていますが、それは私たちにとってはうまくいきます...1つのことを除いて...

サーバーがプロジェクトを再エクスポートしている間、ファイルのチャンクが欠落しているため、Webサイトにリクエストを送信するとエラーが発生します...SVNのエクスポート中にapache/ phpを「キューに入れ」、リクエストを「再開」する方法はありますか? ?

サーバーはファイルを非常に迅速にエクスポートしますが、誰かがサーバーをキャッチしてPHPエラーを発生させるのは数ミリ秒です...

これを整理するための典型的な方法があるかどうか教えてください...

ありがとう

4

4 に答える 4

2

新しいディレクトリツリーにコンテンツを作成し、名前を変更することで、中断を最小限に抑えることができます。つまり、コンテンツがで利用可能であると仮定すると、/var/www/myproject更新後のスクリプトは次のようになります。

  • 人口を増やす/var/www/myproject.new
  • 名前を変更/var/www/myprojectします/var/www/myproject.old
  • 名前を変更/var/www/myproject.newします/var/www/myproject
  • 消去/var/www/myproject.old

アトミックな更新ではありませんが、2つの名前変更を実行するために必要な時間は最小限であり、状況を大幅に改善するはずです。

于 2012-12-01T18:33:47.107 に答える
1
  1. ツリー全体ではなく、このリビジョンで影響を受けるファイルのみをエクスポートし、サイトを削除せずにファイルを置き換えることができます
  2. 完全なエクスポートと完全な置換を実行することはできますが、フック内のサイトを削除することはできません。古いファイルの上に上書きするだけで(リビジョンファイルで削除され、サイトにそのまま残され、無関係であるために壊れません)、完全に実行されます。夜間のcronジョブで(毎日または毎週)同期する
于 2012-12-02T04:09:03.083 に答える
0

次のことがあなたの場合に役立つかどうかはわかりませんが、2段階のコードアップグレードスクリプトを作成できます。

  1. tempdirでのSVNチェックアウト
  2. 本番ディレクトリ内のすべてのコードを、tempdirに含まれるデータに置き換えます
  3. tempdirを削除する

あなたは決して対立を経験することはありません。

ところで、これはベストプラクティスではないと思います。クライアント開発者のマシンでの競合を解決する必要があります。

于 2012-12-01T18:36:37.760 に答える
0

@Larsksの回答は、当時ほぼアトミックで必要なソリューションを提供するのに十分実用的だったと本当に感じています。そのため、彼の回答は「正しい」ものとして維持していますが、この投稿も考慮に入れて貢献したいと思います。

mvが完全にアトミックであると仮定すると、コミット後のフックbashは次のようになります。

svn export file:///svn/repo /var/www/projectdir_NEW --force
mv /var/www/projectdir /var/www/projectdir_OLD
mv /var/www/projectdir_NEW /var/www/projectdir
rm -rf mv /var/www/projectdir_OLD

唯一のことは、2つのmvコマンド間の数秒であり、これはこれを行うためのアトミックで最もクリーンな方法に最も近いです...しかし、完全にアトミックな影響を与えるために、少しのPHPと私のプロジェクトにはグローバルなinit.phpがあるので、post-commitはこれを行うことができます。

date > /var/www/projectdir.updating
svn export file:///svn/repo /var/www/projectdir_NEW --force
mv /var/www/projectdir /var/www/projectdir_OLD
mv /var/www/projectdir_NEW /var/www/projectdir
rm -rf mv /var/www/projectdir_OLD
rm /var/www/projectdir.updating

日付を含む「projectdir.updating」という一時ファイルを作成し、更新を実行してから一時ファイルを削除します。これで、init.phpを使用してリクエストを「スロットル」できます。

while (file_exists("/var/www/projectdir.updating")) usleep(200);

さらに、一時ファイルに保存されている日付の詳細をチェックして、エラーのある終了を確認することもできます...(エクスポートで.updatingファイルの削除に失敗した場合)

于 2012-12-02T21:12:37.017 に答える