【问题标题】:Atomic website update with Git使用 Git 进行原子网站更新
【发布时间】:2013-01-04 19:01:55
【问题描述】:

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

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

我真的有两个问题:

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

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

【问题讨论】:

    标签: git atomic web-deployment


    【解决方案1】:

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

    【讨论】:

    • Capistrano 是一种使用符号链接以原子方式部署代码的工具。
    • 这是一个很好的答案。但是,结果不一致的可能性很小,因为浏览器可能会请求页面,站点可能会更改,然后页面可能会请求不再存在的图像或 css 文件。但是在服务器端你无能为力。
    • @ccleve 如果你想变得更漂亮,你可以尝试将每个 keepalive 会话锁定在一个版本中或使用 cookie。
    • mv 命令中的选项-T 是什么意思?在手册页中找不到它。
    • 谢谢!我发现 OS X 上缺少这个 -T 参数。
    【解决方案2】:

    我不太确定,但你可以为 git 创建 post push hook,它会创建新的目录,或者复制现有的目录,拉取或克隆你的项目并将链接从你的项目更改为新的目录。您的项目目录只是链接到已部署的目录之一。

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

    【讨论】:

      猜你喜欢
      • 2015-08-28
      • 2017-07-16
      • 2014-08-16
      • 2016-04-14
      • 1970-01-01
      • 2012-12-09
      • 2014-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多