git - 使用 Git 进行原子网站更新

标签 git atomic web-deployment

我想以原子方式更新实时网站。如果我们对页面、图像和 javascript 进行了多项更改,所有更改都应该同时出现,不会出现停机、不一致或 404 错误。

如果我简单地将更改的文件复制到网站目录中,那么至少有几个请求会看到一个不一致的站点。如果我将新站点复制到一个单独的目录,然后重命名旧目录以使其停止生产并重命名新目录以使其生效,那么在一小段时间内我们将收到 404。

我真的有两个问题:

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

我如何将其与 Git 协调?我们想使用 git pull(或可能是 push)进行部署。 git 存储库中的站点路径与服务器上的路径不同,因此需要使用 git 命令或操作系统命令进行一些移动/重命名。

最佳答案

您可以使用符号链接(symbolic link)做您想做的事。将一个符号链接(symbolic link)移动到另一个符号链接(symbolic link)是一种原子操作,因此您应该能够避免任何 404 错误。

你的钩子(Hook)会 deploy your site to a directory ,也许以 commit hash 命名.然后它会建立一个符号链接(symbolic link),也许称为暂存。然后它会将该符号链接(symbolic link)移动到生产符号链接(symbolic link)上。

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 的信息.

关于git - 使用 Git 进行原子网站更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14443472/

相关文章:

Git-svn 未采摘的樱桃

git - 了解基本的 git 钩子(Hook)

java - 更新 map 并阅读时锁定免费解决方案

java - 从其组件文件夹创建 war

java - 在heroku上部署Java应用程序

git - 在 Git 存储库中查找早于特定日期的文件

git - 如何将所有提交从一个分支移动到另一个?

c++ - 正确使用 volatile 与 std::atomic_ref<T>

c++ - std::shared_ptr 的 compare_exchange_weak 在 msvs 2013 中损坏了吗?

html - 如何仅在设备上显示响应式网站 View