在生产环境中部署发布的最佳实践

Best practice to deploy release on production

我们有一个包含 350 多个 运行 实例的生产站点,因此即使是短时间的站点停机也很重要。
我的问题: 在将我们的代码推送到生产环境后,如果 composer 有任何更新我们必须更新它,在此期间站点将关闭。那么,在不关闭站点的情况下,在生产环境中更新 composer 的最佳实践是什么?

我正在使用 azure 托管我的网站,我注意到它们的作用如下:

  1. 将代码从 git 拉到暂存文件夹
  2. 在此文件夹中安装作曲家依赖项
  3. 将此文件夹的所有内容复制到活动文件夹

通过 运行 composer 安装在另一个文件夹中,实时包始终可用。唯一可能发生停机的时间是将文件复制到活动目录时,但这将非常短暂。

我强烈建议您使用部署系统,例如 Capistrano (https://github.com/capistrano/capistrano)。

Capistrano 会根据示例将您的 branch/commit 克隆到一个专用文件夹中,运行 脚本如 Composer,如果一切正常,那么它 create/move 到该文件夹​​的符号链接。

它对您的用户是透明的。

如果出现任何问题,您可以要求 Capistrano "rollback",它将使符号链接指向最后一个工作版本(文件夹)。

我建议使用这种方法来实现几乎零停机时间: Web 服务器的根目录必须只是一个符号 link.

  • 为每个版本创建一个新目录并将文件上传到其中。
  • 安装依赖项。
  • 运行 你的测试。
  • 创建一个符号 link 作为指向新发布目录的 Web 服务器的根目录。

因此您无需关闭网站即可直接复制和上传文件到根目录。只需使用符号 links。同样以这种方式回滚到任何旧版本要容易得多。

在 production/stage 个服务器中,您不需要作曲家或 git。

这是我遵循的步骤:

  1. 发布:使用ci工具(如circleci、travis等)运行你的测试,也创建发布版本。

  2. 部署:使用部署工具(如 chef、puppet、ansible),它可以自动发布,最好与一些编排工具(如 kubernetes、terraform 等)一起工作

第 1 步:CI发布

(仅在您的发布分支中,例如:master)

1.1 composer archive

1.2 解压到分发目录mkdir -p dist/ && tar -C dist/ -xf *.tar && cd dist

1.3 composer install --no-ansi --no-dev --no-interaction --no-progress --no-scripts --optimize-autoloader

1.4 使用供应商存储库再次压缩

1.5 制作一个 git 释放抛出 api。您可以使用 https://github.com/tcnksm/ghr 之类的工具或在那里制作您自己的代码

第 2 步:部署

2.1 将您的代码下载到 /some/path/{release-version}

2.2 完成后,删除实际的符号链接(如果有的话)并创建一个新的符号链接到 /some/path/{release-version}

2.3 删除任何以前的版本以避免内存问题