使用Git更新Atomic网站

ccl*_*eve 15 git atomic web-deployment

我想以原子方式更新实时网站.如果我们对页面,图像和javascript进行了多处更改,则所有更改应同时显示,不会出现停机,不一致或404.

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

我真的有两个问题:

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

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

Jas*_*wen 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
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的答案。但是,结果不一致的可能性很小,因为浏览器可以请求页面,站点可以更改,然后页面可以请求不再存在的图像或css文件。但是在服务器端您无能为力。 (2认同)