在您的服务器上安装Mercurial并进行hg pull部署是个好主意吗?


13

过去一个月,我刚刚开始一份新工作,看起来他们没有代码的源代码控制。他们依靠其托管服务提供商为其提供的备份。

经过一番交谈后,我说服了老板我们绝对应该使用源代码控制,并且在我进行了简短的研讨会之后,整个团队都加入了。他们喜欢水星。

所以现在这就是我们的工作方式:

º----------BitBucket
º---------/
º--------/

我自己和hg pullBitBucket的其他三个开发人员进行了更改,然后更改hg push为BitBucket。

现在进行部署时,需要有人将最新文件通过FTP传输到生产服务器。

我当时正在考虑在我们的服务器上安装Mercurial,并使用hg clone(随后使用hg pull)使版本保持最新状态。

º---push->-----BitBucket----<-pull-----º (production server)
º---push->----/
º---push->---/

这是一个好主意吗?我可能没有看到任何潜在的陷阱?这里有人做过类似的事情吗?您如何部署大型PHP框架应用程序(我们正在使用Moodle)?


好主意。为什么会有疑问?
Nikolay Fominyh,2012年

这个过程很多人都认为实际上是“正常的”,以至于Microsoft现在已经内置了支持,以将基于Git的支持(将来可能会提供HG支持)部署到其Azure服务。
艾伦·巴伯

Answers:


12

这当然是一个好主意,并且是用于部署的常用方法。您可能希望使用稳定分支进行部署,同时保留中继进行正在进行的开发,以便可以在将稳定分支部署到生产中之前对其进行测试。

唯一的问题可能出在您的代码库中有敏感信息(例如API密钥等)而您不想上传到第三方服务器(在您的情况下为Bitbucket)中。在这种情况下,一旦您从存储库中提取数据以将敏感数据还原到正确的位置,就可以运行一个简单的脚本来解决该问题。


10

请注意,此部署策略不是原子的。可能是某些文件已经被更新,而其他文件在被应用程序击中时可能仍处于旧状态。这可能会导致意外的副作用。

一种进行原子部署的方法是使用符号链接。创建一个包含新文件的目录。当一切准备就绪时,请更改所使用目录的符号链接。如果保留旧版本,也可以轻松回滚。


3
无论如何,您都可以轻松回滚,这就是VCS的意义所在。
罗布

1
不一定-那么您需要保留配置或某些生成的文件,这些文件可能与VCS中的版本和系统有关。另外,您还必须使用标签(问题描述的过程中未提及)来返回已知的工作版本。
johannes 2012年

2

另一种(我认为更好)的可能性是:使用构建服务器/持续集成服务器。

简短的简短说明:这是您设置的用于监视存储库的服务器(可以在内部,不需要在Internet上),并且只要存储库中有新的变更集,服务器就会构建您的代码( AFAIK(在PHP中不是必需的),运行单元测试并将您的代码部署到Web服务器。

有关更多信息,请检查以下链接:

CI那里有很多不同的产品,但是到目前为止我唯一使用的是TeamCity。设置非常容易...实际上,这是我尝试的第一个,而且我非常喜欢它,因此坚持使用。


替代的廉价解决方案:

如果建立一个构建服务器是太多精力,或者如果您想了解更多的控制什么时候你的网站部署,刚刚成立的脚本文件(批处理/ PowerShell的Windows上,或在Linux / Mac的类似的东西)是拉存储库中的最新版本,并将其通过FTP发送到生产服务器上。

基本上,它与构建服务器相同,只是更简单。


不管您最终如何解决它,都一定要使其自动化!

您希望能够通过单击/键入单个命令来进行部署,以便每个人都可以做到而不必知道任何特殊信息,也不会犯错误-即使在灾难或压力大的情况下。


1

我们这样做或类似的事情。非原子的@johannes提到角度是一个问题,尽管从现实的角度来看,它发生得如此之快,应该可以,他指出,有很多方法可以解决这个问题。

比这种非原子性更重要的是“如何管理数据库架构更新”-以这种方式部署错误的代码使修复变得很容易。最大的问题是,当您部署更新以更改要回滚的数据库时。或者,如果您进行错误的更新并破坏了数据。

我们使用DCVS工具(而不是使用SVN)遇到的另一个问题是,您现在在计算机上拥有了整个代码库的副本,而攻击者可能会抓住它。而且该DCVS代码库在尺寸上可能会非常笨重,如果您要为存储和/或备份付费,这可能很重要。由于这些原因,我们仍将SVN用于最终部署。


1

这是一个好主意,但是请记住以下几点:

  • 尽量不要在服务器上提交(尽管在极少数情况下这样做很有意义,例如安装插件或添加内容资产)
  • 使用登台服务器或辅助存储库部署进行测试
  • 请始终注意hg update -C不要影响生产(即删除重要文件)
  • 拥有生产和开发分支,仅部署生产分支
  • 将资产视为备份(例如,内容的图像),并忽略用户数据(例如,附件/上载,缓存等)
  • 始终hg status在服务器上提供干净的输出(这将帮助您确保忽略作为缓存的内容)
  • 不要将存储库部署在Web文件夹中。在公共空间之外使用符号链接(例如ln -s / myrepo / src / web / public_html / myapp)
  • 注意不要对配置文件进行版本控制(特别是使用数据库密码或其他版本)
  • 不要代替生产备份使用,这是生产代码而不是生产数据的开发备份

最后,我认为将DVCS添加到部署过程中最有价值的事情是,这将为部署增加安全性,有时黑客会向您的东西注入恶意代码,并且如果没有版本控制之类的东西,您真的无法轻松地检测到它(特别分散,因为VCS的分布式方面使检查文件完整性更加容易。

我曾经几次遭到某些站点的黑客攻击,Mercurial 只是通过在服务器中发布一个帮助我彻底解决了这种黑客攻击hg update -C(当然,您可能想要这样做hg status并获取受影响的文件以供以后分析)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.