我目前正在进行一项简短的研究项目。我工作的公司有一个非常繁重的发布过程,随着时间的推移越来越严重。我们在每个版本中遇到越来越多的问题,这些问题开始严重影响我们的交付时间表和每个版本的质量。我们提供了一个大型SAAS产品,该产品在一个非常大的Web场上部署到Internet。我们的部署流程目前由专门的团队处理,开发人员参与最少。我们主要是.NET商店,但我们也有几个Java组件。
我正在研究如何改进质量保证和部署流程,以减少浪费,并将更多流程纳入我们的开发团队。我有兴趣了解贵公司如何将您的产品(最好是SAAS,但不仅限于此类产品)部署到生产中,以及通过测试途径进行生产。我很好奇什么有效,什么没有,我相信很多人都有故事要讲。
EDIT(附加RFC):
当我继续我的研究时,我遇到了“持续部署”的概念,显然是由IMVU 3d在线社区团队开创的。这听起来像一个有趣的概念,如果可能有点复杂。我很好奇,如果SO上的任何人有持续部署的经验吗?特别是一个大型,复杂的项目,它有很多部分。您不一定必须不断地部署到生产......对于我们的短期需求,我们只会考虑持续部署到内部dev / qa / perftest环境。如果有人实施了持续部署,我也很想知道如何管理数据库架构和数据更改/回滚。
谢谢!
答案 0 :(得分:7)
我们将金融服务SaaS解决方案部署到Amazon AWS云环境。我们的解决方案是100%Java,因此许多工具不适用于您,但概念应该适用。
首先,在通过运行持续集成流程进行发布时,我们减少了意外数量。任何时候任何开发人员签入源代码,整个解决方案都会自动构建,所有单元测试都会自动运行。失败通知会通过电子邮件发送给相关开发人员和团队负责人。
AWS围绕虚拟机的概念构建。我们通过创建一个虚拟机映像(亚马逊称之为AMI)来利用这一点,该映像包含我们所需的操作系统和应用程序(Java,DB等)的特定版本。构建过程会创建所有可部署的工件,然后根据该AMI将它们复制到正在运行的实例。对于所有环境(TEST,DEMO,PROD),它都是完全相同的过程,除了封装版本差异的单个配置项目(例如连接字符串)。
QA在TEST环境中测试结果。一旦他们批准了该版本,我们就会重复针对PROD的构建过程(使用完全相同的版本控制修订版。请记住,每个环境之间的唯一区别是一个配置项目。)
此时,我们使用PROD代码库创建在基本AMI上运行的虚拟机(实例),并将其称为STAGING。 STAGING经历了一系列自动和手动验收测试。这是非常好的部分......现在,我们将此环境(基本AMI加上我们的应用程序的新版本)刻录到 new AMI(虚拟机映像)中。然后我们基于这个新映像创建我们的应用服务器的新运行实例,更新负载均衡器以指向这些新实例,并且只是杀死旧实例。这就是使用虚拟机的美妙之处(至少,这是美女之一)。
每当我们需要调整容量(高峰时段/天)时,我们都会从同一个生产AMI创建新的应用服务器实例,并将其注册到负载均衡器。当峰值结束时,我们只是将它们从负载平衡旋转中移除,然后在几分钟后终止额外的实例(以允许现有会话完成)。
答案 1 :(得分:1)
我们有一个SaaS解决方案,基本上使用相同的流程(持续集成服务器,用于测试登台生产的部署脚本),如上所述,但我们使用基于PSTools的自定义脚本将其部署到我们自己的基础架构({{3 })将所有复制到场节点。
对于每个部署,我们评估是否可以允许不同节点具有不同版本的应用程序(即没有数据完整性风险),或者我们必须让应用程序离线几秒钟以同步所有节点(通常应用程序重新上线大约需要20秒,因为它只是从一个主节点处理应用程序);但整个关键是要有一个“一键”的部署过程设置。
答案 2 :(得分:0)
您是不是在说什么导致您的版本出现问题?我们遇到了问题,因为错误的文件最终出现在我们的构建中。我们对此的回答是构建一个工具,使我们能够控制和查看构建中的所有文件。 Here是我们构建的工具的网络广播。
答案 3 :(得分:0)
免责声明:我可能会卖掉我写过的内容,但就目前来说,它是免费的(而且还没有正式发布)。
我们使用的是我写过的系统。
它通过与源控件和CI服务器集成来运行。它允许我将代码提交到SVN,等待构建服务器上的构建,然后通过apps接口为特定构建配置它,将其 back 提交到源代码控制中,然后,在服务器上,它会更新。美妙的是你可以更新asynch,所以所有服务器都会在同一时间内获得新版本。
它比这复杂一点,并且需要一定的设置方式,但是当它处于行动中时,它真的非常漂亮(在我非常偏见的意见中)。如果你想要一个免费的'alpha'版本,请给我发一封电子邮件。任何测试版都是免费的。
- 编辑:
一般过程:
“部署”阶段包括提交到SVN,然后安装在Web服务器上的程序从SVN获取构建。
实际上,我在您的标准SVN结构中添加了一个新的“基础”级别项。你通常有:
/trunk
/braches
/tags
使用dashy,我添加/releases
/trunk
/braches
/tags
/releases