主要问题:在生产服务器上使用 Git 部署是一个好策略吗?
我看到的许多部署策略都围绕在服务器(开发、暂存和生产)上安装 Git。
对于阶段/生产部署来说,这样做的优点显而易见:
- 能够快速引入变更
- 更简单的自动化
- 如果需要可以切换分支(可能是每个测试服务器的分支)
- 可以查看生产服务器中的文件是否发生了某种变化
然而,我发现这样做有一些缺点:
- 安全性——即使生产环境具有只读访问权限,Git 似乎也是一个潜在的攻击载体
git pull
如果生产中存在未暂存的更改,则生产服务器上的更改可能会失败(尽管可以使用 -f 克服)
部署即服务公司(例如 Beanstalkapp.com、deployhq.com)使用 FTP、SFTP 或 SSH。Beanstalkapp 尤其擅长仅根据 git 历史记录修改文件(而不是重新部署每个文件)。这些服务不要求您在阶段/生产服务器上安装 git(尽管如果您通过 SSH 部署,您可能会/可以使用该策略,这一点值得商榷)。
我发现我喜欢使用 sftp:
- 仍可在部署前/部署后运行脚本
- 无论生产服务器上是什么,都会覆盖、移动、删除文件(这对我来说是一个优点)
- 生产环境中没有.git 目录或任何基于 git 的攻击漏洞
从最佳实践和安全性的角度来看,在生产服务器上使用 git 的便利性是否值得?如果不值得,那么跳过持续集成工具进行部署的好方法是什么?
(我仅询问是否跳过 CI 工具,因为时间/预算/客户限制不允许我在日常使用它们)。
答案1
回答您的问题:是的,使用 git(或任何其他修订控制)进行部署是可行的方法,特别是当您的基础设施开始变得复杂/庞大时。
回答你的疑虑
安全必须分层实施,即使 git 确实是一个令人担忧的攻击媒介,也需要有人获得服务器访问权限才能做到这一点。拥有良好的服务器安全性、基于 SSH 密钥的身份验证和访问控制/日志记录,您的风险就会非常低。
如果您想编写部署工具,当然您必须考虑回滚程序,以防代码更新失败。好消息是,像 capistrano(我更熟悉)这样的工具已经内置了所有这些步骤,您可以更改行为等。
我认为最好的是使用部署工具卡皮斯特拉诺或者部署者弗拉德甚至Chef 部署如果您已经有 Chef(或其他配置管理工具)。
例如,Capistrano 默认针对的是 Rails,但您可以对其进行定制以部署任何内容。它将连接到您的服务器,更新代码(保留一些旧版本以防您需要回滚到以前的版本),执行数据库迁移或清理等任务,然后在需要时重新启动服务。您可以根据您的环境对其进行定制,甚至可以拥有不同的环境(我曾使用生产、声明和其他 3 个环境)。
所有其他工具都允许您做类似的事情,我认为只有当您的系统与“通常”的系统确实不同时,花时间编写部署脚本才有效。