使用Git更新Atomic网站

时间:2013-01-21 16:53:59

标签: git atomic web-deployment

我希望以原子方式更新实时网站。如果我们对网页,图片和JavaScript进行了多次更改,则所有更改都应同时显示,不会出现停机,不一致或404.

如果我只是将更改的文件复制到网站目录中,那么至少有少数请求会看到不一致的网站。如果我将新站点复制到一个单独的目录,然后重命名旧目录以使其停止生产并重命名新目录以使其生效,那么在短暂的一刻我们将获得404.

我真的有两个问题:

如何以原子方式更新文件目录?

如何与Git协调?我们想使用git pull(或可能推送)进行部署。 git repo中站点的路径与服务器上的路径不同,因此需要使用git命令或OS命令进行一些移动/重命名。

2 个答案:

答案 0 :(得分:22)

你可以使用符号链接做你想象的事情。将一个符号链接移动到另一个符号链接是原子操作,因此您应该能够避免任何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

-T参数是--no-target-directory的缩写形式,它是GNU mv的一部分,可防止它将源移动到目标位置。详细了解target directories

答案 1 :(得分:0)

我对此并不完全确定,但你可以为git创建post push hook,它可以创建新的dir,或者复制现有的dir,拉动或克隆你的项目并将项目链接更改为新的dir。您的项目目录只是链接到其中一个已部署的目录。

但我的方法听起来像是解决方法。