- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定一个大型软件项目,其中包含用不同语言编写的多个组件,配置文件,配置脚本,环境设置和数据库迁移脚本-部署到生产环境的常见做法是什么?
有哪些困难要考虑?可以使用Ant或Maven之类的工具简化该过程吗?如何处理回滚和数据库管理?是否建议在生产环境中使用版本控制?
最佳答案
正如我所看到的,您主要是在询问release engineering AKA相关的最佳做法和工具-了解主题的“专业术语”很重要,因为它使查找更多信息变得更加容易。
在当今的软件开发中,必不可少的是配置管理系统(CMS,又称修订控制系统或版本控制系统)。如果您使用一个或多个IDE,则它们与CMS之间具有良好的集成也很不错,尽管对于开发目的而言,而不是出于部署/依赖的目的,这更是一个问题。
从一个不相关的观点来看,CMS的关键在于它必须对“分支”(使用任何名称)都具有良好的支持,因为发布必须从“发布分支”进行,在该分支中所有正在开发的代码及其所有依赖项(代码和数据)位于稳定的“快照”中,可以随意复制精确,相同的配置。
如果您必须维护多个分支(针对不同的用途,平台等而定制),那么对良好的分支支持的需求可能会更加明显,但是即使您的发行版始终严格按照单个线性顺序进行,依托最佳实践仍然需要制定一个发布分支。 “良好的分支支持”包括易于合并(对文件进行不同更改时的“冲突解决”),“选择樱桃”(从一个分支或头/主体获取一个补丁或变更集,并将其应用于另一个分支),等等。
实际上,您可以通过创建一个发布分支来开始发布过程。然后,您需要在该分支上进行详尽的测试(通常比连续构建中每天要进行的测试要多得多-包括广泛的回归测试,集成测试,负载测试,性能验证等,并且可能还要花费更高的质量保证流程,具体取决于)。如果详尽的测试和质量检查发现发布候选版本中存在缺陷(包括回归,性能下降等),则必须予以修复;在大型团队中,在进行质量检查时,可能需要继续进行头部/树干的开发,因此需要轻松进行樱桃采摘/合并等操作(无论您是在头部还是在发布分支上进行修复,它仍然需要合并到另一端;-)。
最后但并非最不重要的一点是,除非您以某种方式跟踪CMS发行版所依赖的“所有内容”,否则您不会从CMS获得全部相关的价值-最简单的方法是拥有该工具的所有二进制文件的副本或硬链接您需要构建发行版等,但这通常不切实际;因此至少要跟踪使用的那些工具(操作系统,编译器,系统库,将图像,声音或视频文件预处理为最终形式的工具等)的确切版本,版本,错误修正和c编号。关键是在需要时能够准确地重现所需的环境,以重建建议发布的确切版本(否则,您会发疯地追踪细微的错误,这些错误可能取决于第三方工具的版本更改;- )。
继CMS之后,第二个最重要的相关工具是良好的问题跟踪系统-理想情况下,它已与CMS很好地集成在一起。这对于开发流程(以及产品管理的其他方面)也很重要,但是就发布流程而言,问题跟踪工具的重要性在于能够轻松准确地准确记录已修复的错误,已添加的功能,已删除的功能,或更改,以及预期在新的即将发布的版本中对性能(或其他用户可观察到的特性)进行哪些修改。为此,开发中的一个关键“最佳实践”是,提交给CMS的每个变更集都必须与问题跟踪系统中的一个(或多个)问题相关联:毕竟,该更改必须有一定的目的(修复应该对软件用户不可见的错误,更改功能,优化某些内容或进行内部重构);同样,每个标记为“已关闭”的跟踪问题都必须与一个(或多个)变更集相关联(除非关闭属于“无法修复/按预期工作”类型;与第三方组件中的错误&c有关的问题如果您确实也要跟踪CMS中的所有第三方组件,则由第三方供应商修复的,很容易类似地处理,请参见上文;否则,至少应该有文字CMS下的文件记录了第三方组件及其演化,再次参见上文,当第三方组件上的某些跟踪问题被关闭时,需要对其进行更改)。
自动化各种相关的流程(包括构建,自动化测试和部署任务)是第三要务-自动化流程比要求某些贫困人员手动执行一系列步骤(对于足够复杂的任务,当然,自动化的工作流程可能需要“使人陷入困境”)。当您猜测时,诸如Ant
(和SCons
等)的工具可以在这里提供帮助,但是不可避免的(除非您很幸运地摆脱了非常简单直接的过程),您会发现自己在丰富它们使用即席脚本&c(一些强大而灵活的脚本语言,如perl,python,ruby和&c会有所帮助)。当您的发布工作流程足够复杂时(例如,涉及特定的人员或团队,在质量保证合规性,法律合规性,UI准则合规性等方面“签名”),“工作流引擎”也可能很宝贵。
您要询问的其他一些特定问题因环境的不同而有很大差异。如果您可以承受程序性的停机时间,那么即使使用大型数据库,您的生活也相对容易,因为您可以按顺序确定性地进行操作:请妥善关闭现有系统,确保保存并备份了当前数据库(减少了回滚, (在非常罕见的情况下是需要的),运行用于模式迁移或其他“不可逆”环境更改的一次性脚本,以普通用户仍然无法访问的模式再次触发系统备份,运行另一套广泛的自动化测试套件-最后,如果一切进展顺利(包括在新状态下保存和备份数据库,如果有的话),系统将再次开放供一般使用。
如果您需要在不停机的情况下更新“实时”系统,则范围可能从轻微的不便到系统的噩梦。在最佳情况下,事务是相当短的,事务设置的状态之间的同步可能会稍有延迟而不会造成损坏……并且您拥有相当多的资源(CPU,存储设备和c)。在这种情况下,您要并行运行两个系统-旧的和新的-并确保所有新事务都针对新系统,同时让旧事务在旧系统上完成。随着旧系统上的事务终止,一个单独的任务会定期将“旧系统中的新数据”同步到新系统。最终,您可以确定旧系统上没有正在运行的事务,并且在那里发生的所有更改都已同步到新的事务上–那时您可以最终关闭旧系统。 (当然,您也需要准备“反向同步”,以防需要回滚更改)。
这是实时系统更新的“简单,甜蜜”的极端。在另一个极端,您会发现自己处于一种过度约束的情况,以致无法证明该任务是不可能的(您不能用给定的资源在逻辑上满足所有规定的要求)。在旧系统上打开的长时间会话无法终止-稀缺的资源使无法并行运行两个系统-每个事务的硬实时同步的核心要求-等等,这些都可以使您生活惨淡(正如我所注意到的那样,极端情况下,使所陈述的任务绝对不可能)。您可以执行以下两项最佳操作:(1)确保您拥有足够的资源(当某些服务器意外崩溃时,这还将节省您的皮肤...您将需要另外一台服务器来应对紧急情况! -); (2)在最初定义整个系统的架构时,请从一开始就考虑这一困境(例如:相对于无法从快照中无缝快照,关闭和重新启动的长期会话,更喜欢短期事务“,是一种好的建筑指针;-)。
关于deployment - 部署大型系统有哪些常规做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1485160/
我是 DevOps 的新手。我为刚刚在 Digital Oceans 上创建的 Kubernetes 集群编写了一个 deployment.yaml 文件。创建部署不断出现我现在无法解码的错误。这只是
我需要能够在 Red5 运行时进行部署。我知道的唯一解决方案是使用 WAR 文件并将其放在文件夹中:webapp。 还有其他办法吗? 我使用的是 Red 5 v0.8。我使用 Eclipse 3.4
我收到以下错误: Recycling (Waiting for role to start... Sites are being deployed. [2012-12-17T05:30:10Z]) R
使用 TeamCity 6.5,我试图弄清楚如果可能的话,如何为特定的构建运行设置手动部署。 我希望能够做的是运行已经构建和测试的 TeamCity(仅需要部署工件 - 这不是 Web 应用程序或站点
我看到一个范围为环境的编辑变量权限。但是,似乎谁负责设置项目,谁就会负责创建变量,而其他一些安全实体将只负责修改值,特别是安全值。这可能吗? 编辑:再补充一点,我想我是在根据项目变量集请求权限。只有拥
在我通过命令部署到我的服务器后: bin/dep deploy 在“releases ”文件夹中,我有名为喜欢的文件夹 1 , 2 , 3 , ... 我怎样才能把它改成时间戳,所以在部署命令之后我会
问题: 我有一个手动干预步骤,其中包含执行部署的人员要遵循的文本步骤。 我想传递目标服务器的名称,这样这个人就不需要查找目标服务器名称。 例如,如下所示,我需要将它们解压缩到目标服务器上的某个位置。
这是一个系统 Octopus 部署变量: #{Octopus.Action[Deploy To Server].Output.Package.InstallationDirectoryPath} 文本
我正在尝试在 Octopus Deploy 中设置部署。与许多其他开发人员一样,我通过迭代来做到这一点:调整步骤/脚本/包 -> 单击“部署” -> 检查结果 -> 如果不满意,则重新开始。在 Oct
在使用 Network Deployment 安装 WebSphere Application Server 时,节点是: 物理机 操作系统实例 一组独立于物理机或操作系统实例的逻辑 WAS 实例 最
我知道目前有一个 feature request对于这样的事情,但我希望使用当前版本(1.6)有某种解决方法 我们从 TFS 中的开发分支为我们的开发和测试环境构建,并从 TFS 中的发布分支为我们的
我正在尝试运行由 MSBuild 生成的 ProjectName.deply.cmd 当参数 /p:DeployOnBuild=True通过。参数“ComputerName”之一将作为 https:/
有时首选和/或需要在单个服务器上托管数十个应用程序。不是说这是“对”或“错”,我只是说它发生了。 此配置的缺点是出现错误消息Waiting for the script in task [TASK I
部署准备使用的 erlang 应用程序时我 不要希望用户 在上找到正确的 erl 版本 互联网。 安装 erl vm 解压缩并确定梁文件的位置(与应用程序一起) 阅读自述文件 修改任何看起来像配置文件
使用Next.js创建的app部署到netlify时,出现如下错误,部署失败。 ────────────────────────────────────────────────────────────
我有一个包含两个模块的项目:客户端和服务器。在父 pom.xml 中,我添加了部署阶段的信息,以便部署到本地目录: 4.0.0 org.my myTest 0.1 pom m
我们正在运行 OD 1.6。 我想使用 OD 变量来更改不在应用设置部分中的值,例如 session 状态提供程序。 我知道我可以为此使用转换,但作为一家公司,我们更喜欢使用 OD 变量而不是转换,因
Plesk Obsidian 提供 GIT 部署,我们正在尝试将其配置为类似于我们之前在 CPANEL 上的配置(我们最近从与 CPANEL 的共享帐户升级到与 Plesk 的 VPS - Plesk
我对这个主题进行了大量研究,但找不到任何端到端解决方案来使用 TFS 2010 实现“一次构建并部署多次”。 基本上我在想的是有一个构建定义,它将构建一个解决方案,其中包含多个要部署的项目(Web 应
我已经阅读了关于如何使用 pm2 的几个问题和想法。在 Windows 机器下,不管你信不信,我以前的机器运行得很好......然后我不得不重新格式化它并完全忘记了我以前做过的事情:( 我已经安装了
我是一名优秀的程序员,十分优秀!