在我工作的公司,我们的开发环境相当复杂。我们的系统在多台服务器上运行,每台服务器都充当不同的角色,并有自己的代码库。每个角色可能有多个实际服务器(例如,我们可能有 2 个消息服务器、3 个存储服务器、1 个 Web 服务器、1 个数据库等)。
到目前为止,服务器端开发人员一直在使用 SVN,而其他开发人员则一直在自己跟踪自己的代码。每个人都通过 FTP 手动上传到正确的服务器。这意味着,如果有人更改了消息服务器的代码,他就需要手动将更改上传到 2 个或更多服务器。
重要提示:并非所有服务器都在同一个局域网上。
我一直在考虑改变每个人的工作流程,并希望咨询一下最佳的设置是什么。
我原本打算使用单个 SVN 服务器(基本上向所有人开放服务器端 svn),并为每个“服务器角色”设置不同的存储库。并将每个存储库的后期提交到该类型的服务器,这将在每个服务器上的工作副本上运行“svn 更新”。(我宁愿将所有服务器角色的代码放在单个存储库中 - 但我将如何处理后期提交脚本?)
我的问题是:a) 这是最好的设置吗?b) 您将如何实现提交后脚本?它如何知道将更新发送到哪个服务器?c) 确保这一点的最佳方法是什么(有多个开发人员)?
提前感谢大家的回复。任何帮助和建议都非常感谢!
肯。
答案1
读完你的问题后,我认为你正在寻找的更像是部署工具集,而不是开发设置。无论你选择哪个方向,我认为你需要做的第一件事就是将所有代码纳入源代码管理。如果不能对每个子服务进行版本控制,就无法合理地拥有任何可靠的部署系统。将所有项目放在一个 SVN 服务器下是可以的;您需要一个非常大的项目才能超越单服务器方法,并且它使您能够轻松地在所有子项目中分支/标记发布。
我建议你看看专门为部署而构建的工具,比如卡皮斯特拉诺,织物, 或者控制层。每个项目都有自己的优点和缺点(Capistrano 与 Rails 配合良好,ControlTier 与 Java 配合良好,等等),您可能会发现最好的工具取决于您的子项目所用的语言。与简单的提交后挂钩相比,更喜欢部署系统的一些原因如下:
- 编写一些在少数服务器上给定目录上运行“svn up”的脚本并不难,但部署系统将处理诸如暂存与生产环境、失败部署的回滚等事情。
- 部署应该是与检查代码分开的步骤。我通常更喜欢在一天中的某个时间进行部署(比如上午 10 点左右,此时工程支持最有可能可用,或者半夜,此时网站流量接近最低点),开发人员应该可以自由地签入不一定会导致部署的代码。如果您已建立持续集成系统,您希望在部署之前测试/验证您的代码。这可以通过让提交后挂钩检查已提交文件的路径并仅在对发布分支进行更改时进行部署来实现。
- 部署过程本身应该是记录的、可重复的和版本控制的。有正当理由想要重新部署同一个版本(例如,在您的设置中添加更多服务器),而不需要为了启动另一个构建而向源代码控制进行虚假提交。此外,我希望让开发人员能够看到部署所需的步骤。Capistrano 非常适合这种情况,因为您实际上是将一个描述如何运行部署的文件签入源代码控制。如果您只是使用提交后挂钩,请确保它与您的 SVN 存储库数据本身一起备份!
安全性在很大程度上取决于业务需求。在较小的公司,我认为将“城堡的钥匙”交给开发人员,甚至在团队中轮流部署任务,这没有什么不妥。如果您在开发人员无法访问生产数据的环境中工作,则需要设计一个系统,让他们可以触发部署(通过签入或其他流程),但不能访问部署系统的身份验证本身。如果您在 UNIX 平台上运行,这可以很简单生成 SSH 密钥进行部署,并且只将密钥交给负责部署的人员。