2013-01-21 6 views
13

ライブウェブサイトを原子的な方法で更新したいと思います。ページ、画像、およびJavaScriptにいくつかの変更を加えた場合、すべての変更は、停止時間、不一致、または404なしで同時に表示されるはずです。Gitの原子ウェブサイトの更新

私は単純に、少なくともいくつかの要求が一貫性のないサイトが表示されます、その後、Webサイトのディレクトリに変更されたファイルをコピーする場合。新しいサイトを別のディレクトリにコピーした場合は、古いディレクトリの名前を変更して新しいディレクトリの名前を変更してライブにしてください。すると、すぐに404が取得されます。

がどのように私は、原子方法でファイルのディレクトリを更新することができます。

私は実際には2つの質問がありますか?

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

答えて

21

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

あなたのフックがdeploy your site to a directory、おそらくcommit hashにちなんで名付けられます。そうすれば、おそらくステージングと呼ばれるシンボリックリンクが作成されます。その後、シンボリックリンクをプロダクションシンボリックリンク上に移動します。

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 
+0

Capistranoは、シンボリックリンクを使用してコードをアトミ​​ックに展開するツールです。 – user1158559

+1

これは素晴らしい答えです。しかし、ブラウザがページを要求したり、サイトが変更されたり、ページがイメージやCSSファイルを要求したりする可能性があるため、一貫性のない結果が生じる可能性はわずかです。しかし、サーバー側では何もできません。 – ccleve

+0

@ccleveあなたが本当に気に入られたいのであれば、各キープアライブセッションを1つのリリースにロックしたり、クッキーで遊んだりすることができます。 – Zenexer

0

私はそれについては全くわかりませんが、あなたは新しいディレクトリを作成し、gitのためのポストプッシュフックを作成することができ、またはコピー1を既存の、引っ張ったり、プロジェクトのクローンを作成し、新しいディレクトリにプロジェクトからのリンクを変更します。あなたのプロジェクトディレクトリは、配備されたディレクトリの一つへのリンクです。

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

2

枚オーウェンはあなたが展開され、最後のリリースへのシンボリックリンクを使用して、言いました。 http://bugfixer.endel.me/2013/08/04/simple-atomic-deployment-with-git

新しいリリースが準備されているときにシンボリックリンクを作成するリモートgitサーバーで受信後のフックを設定することができます。

関連する問題