16

ライブ Web サイトをアトミックに更新したいと考えています。ページ、画像、および JavaScript にいくつかの変更を加えた場合、すべての変更は、ダウンタイム、不整合、または 404 なしで同時に表示されます。

変更したファイルを Web サイトのディレクトリに単純にコピーすると、少なくともいくつかの要求で一貫性のないサイトが表示されます。新しいサイトを別のディレクトリにコピーし、古いディレクトリの名前を変更して運用を停止し、新しいディレクトリの名前を変更してライブにすると、しばらくの間 404 が発生します。

本当に 2 つの質問があります。

ファイルのディレクトリをアトミックに更新するにはどうすればよいですか?

これをGitとどのように調整できますか? git pull (または場合によっては push) を使用してデプロイしたいと考えています。git リポジトリ内のサイトのパスはサーバー上のパスとは異なるため、git コマンドまたは OS コマンドを使用して、移動/名前変更を少し行う必要があります。

4

2 に答える 2

22

シンボリックリンクを使用して、想像していることを実行できます。あるシンボリック リンクを別のシンボリック リンクに移動することはアトミック操作であるため、404 エラーを回避できるはずです。

フックは、おそらくコミット ハッシュにちなんで名付けられたディレクトリにサイトをデプロイします。次に、おそらくステージングと呼ばれるシンボリックリンクを作成します。次に、そのシンボリックリンクを本番シンボリックリンクに移動します。

hash=`git rev-parse HEAD`
git checkout-index -a -f --prefix=/srv/www/$hash/
ln -s /srv/www/$hash /srv/www/staging
mv -T /srv/www/staging /srv/www/production

-T引数は、GNU--no-target-directoryの一部であるの短縮形であり、ソースが宛先に移動するのを防ぎます。ターゲット ディレクトリの詳細を参照してください。mv

于 2013-01-21T17:14:43.627 に答える
0

完全にはわかりませんが、新しいディレクトリを作成するgitのポストプッシュフックを作成するか、既存のものをコピーし、プロジェクトをプルまたはクローンして、プロジェクトから新しいディレクトリへのリンクを変更できます。プロジェクト ディレクトリは、展開されたディレクトリの 1 つにリンクするだけです。

しかし、私の方法は回避策のように聞こえます。

于 2013-01-21T16:58:55.300 に答える