Questions tagged «continuous-delivery»

持续交付是软件开发的新兴领域,它将持续集成进一步向前迈进了一步。练习连续交付的软件团队会创建构建管道,使他们能够高频地集成,测试和部署其软件产品。

7
有期限的待办事项?
背景 我正在一个团队中实施零停机时间部署。为了实现此目标,我们正计划使用蓝/绿部署策略。我在进行研究时意识到的一件事是进行数据库更改变得多么复杂。重命名列之类的简单操作可能需要3个完整的发布周期,直到完成! 在我看来,全面实施变更需要多个发布周期,这会带来很多潜在的人为错误。在链接的文章中,它表明2个发行版需要更改代码,而3个发行版需要数据库迁移。 我在寻找什么 当前,如果我们想记住要做的事情,可以在我们的问题管理系统中创建票证,这会造成混乱,并且还可能被管理层转移到以后的冲刺或待办事项中;或者我们可以创建一个TODO注释,它可能会完全被遗忘。 我正在寻找的方式是TODO注释可以有一个截止日期,并且,如果该截止日期已过期,我们的持续集成系统(当前将使用的未定)将拒绝该构建。 例如,如果我们重命名列,则可以为其创建初始迁移,然后创建两个TODO注释以确保创建其余的两个迁移: // TODO by v55: Create migration to move constraints to new column, remove references to old column in app // TODO by v56: Create migration to drop old column 这似乎很容易实现,但是我想知道是否已经存在类似的东西,因为我不想重新发明轮子。 其他想法 考虑到滚动部署和蓝/绿部署被认为是最佳实践,我觉得自己可能在这里遇到了XY问题,但我找不到能够减轻数据库更新麻烦的解决方案,这似乎很奇怪。如果您认为我正在完全研究错误的内容,请在评论中告诉我!就是说,我给出的数据库示例只是一个示例,我认为带有到期日期的TODO注释在其他情况下也将很有用,因此即使我正在接近这种特定情况,我还是很想回答我的问题也是实际问题。谢谢! 编辑:我只是想这可能会有所帮助的另一种情况。如果在准备就绪时使用Feature Toggles来打开应用程序的某些部分,则必须小心清理它们,否则最终可能会出现Toggle Debt。带有截止日期的评论可能是记住这一点的好方法。

2
为什么build.number是语义版本控制的“滥用”?
我解释提出了构建系统(摇篮/ Artifactory的/詹金斯/厨师),以我们的高级建筑师之一,他所提出的意见,我认为我的那种不同意,但我没有足够的经验,真正权衡上。 该项目构建了一个Java库(JAR)作为工件,供其他团队重用。对于版本控制,我想使用以下语义方法: <major>.<minor>.<patch> 其中patch指示错误/紧急修复,minor指示向后兼容的发行版,并major指示API的大规模重构和/或向后不兼容的更改。 就交付而言,这就是我想要的:开发人员提交一些代码;这将触发构建到QA / TEST环境。一些测试已经运行(一些自动化,一些手动)。如果所有测试均通过,则生产版本会将JAR发布到我们的内部仓库中。至此,应该正确地对JAR进行版本控制,我的想法是使用build.numberCI工具自动生成并提供的JAR 作为补丁号。 因此,版本控制实际上是: <major>.<minor>.<build.number> 同样,build.numberCI工具在哪里提供。 架构师对此表示否认,称使用CI版本号是语义版本控制的“滥用”。 我的问题是:这是正确的吗?如果正确,为什么?如果没有,为什么不呢?

2
在VCS中存储软件版本号是一种好习惯吗?
产品版本(例如)v1.0.0.100不仅代表软件的唯一生产版本,而且还有助于识别该产品的功能集和修补程序阶段。现在,我看到两种方法来维护产品的最终程序包/内部版本/二进制版本: 版本控制。一个文件存储着版本号。持续集成(CI)构建服务器将具有脚本来构建软件,该脚本使用此签入的版本号将其应用于所需的软件的所有区域(二进制文件,安装程序包,帮助页面,文档等)。 环境和/或构建参数。这些在版本控制之外进行维护(即,它们不依赖于快照/标签/分支)。构建脚本以相同的方式分配和使用数字,但是它们只是以不同的方式获取值(将其提供给构建脚本,而不是让脚本知道相对于源树在何处获取该值)。 第一种方法的问题在于,它会使跨主线分支的合并变得复杂。如果您仍然维护同一软件的2个并行发行版,并且自上次合并以来两个主版本的版本均已更改,则将在合并两个主干之间时解决冲突。 第二种方法的问题是和解。回到1年前的发行版时,您将仅依靠标签信息来标识其发行版号。 在这两种情况下,版本号的某些方面可能在CI生成之前是未知的。例如,CI构建可能会以编程方式放入第4个组件,该组件实际上是自动构建编号(例如,分支上的第140个构建)。它也可能是VCS中的修订号。 跟上软件版本号的最佳方法是什么?是否应始终在VCS中维护“已知”部分?如果是这样,主线分支之间的冲突是否成为问题? 现在,我们通过CI构建计划(Atlassian Bamboo)中指定和维护的参数来维护版本号。在合并到我们的master分支机构之前,我们必须小心一点,即在开始构建CI之前已正确设置了版本号。关于Gitflow工作流程,我认为,如果在源代码管理中跟踪了版本号,我们可以保证在创建release分支以准备发布时正确设置了版本号。质量检查人员将在该分支机构上执行最终的集成/烟熏/回归测试,并在签收后进行合并,master这表示发布承诺。

6
连续交付在实践中如何工作?
连续交付听起来不错,但是我多年的软件开发经验表明,在实践中它是行不通的。 (编辑:为了明确起见,我总是有很多测试会自动运行。我的问题是关于如何使每次签入都充满信心,我知道这是CD的完整格式。替代方法不是一年周期每周两次(如果正确完成,有些人可能会认为它仍然是CD),两周或一个月的迭代;在每个迭代的末尾都包含老式的质量检查,以补充自动化测试。 无法全面覆盖测试。对于每件事,您都必须投入大量时间-时间就是金钱。这是有价值的,但是可以花费时间以其他方式为质量做出贡献。 有些事情很难自动测试。例如GUI。甚至Selenium也不会告诉您您的GUI是否不稳定。没有笨拙的固定装置,很难测试数据库访问,甚至无法覆盖数据存储中的奇怪情况。同样的安全性和许多其他事情。只有业务层代码才可以有效地进行单元测试。 即使在业务层中,大多数代码也不是简单函数,其参数和返回值可以很容易地隔离以进行测试。您可能会花费大量时间来构建模拟对象,这可能与实际实现不符。 集成/功能测试是对单元测试的补充,但是它们需要大量时间才能运行,因为它们通常涉及在每个测试中重新初始化整个系统。(如果不重新初始化,则测试环境会不一致。) 重构或任何其他更改都会破坏很多测试。您花费大量时间修复它们。如果只需要验证有意义的规范更改,那很好,但是测试常常由于无意义的低级实现细节而失败,而不是真正提供重要信息的东西。通常,调整主要集中在重新测试内部,而不是真正地检查正在测试的功能。 错误的现场报告无法轻松地与代码的精确微版本相匹配。

4
在什么时候应该切换到发布版本?
Jez Humble的“ 持续交付”中阐述的一种做法是,您应该构建一个软件包,然后将其发布到部署到的每个环境中,以便在投入生产之前,已经多次测试了部署和工件。 我完全支持这个想法。 另一方面,为您提供带行号的堆栈跟踪的调试模式构建在测试环境中非常有用,远程调试功能也是如此。但是,您想将发布版本发送到生产环境。 那么,对于遵循第一条原则的人们,您在什么时候从调试版本切换到发行版本? 是在第一次部署到测试环境之前,确定丢失调试模式的成本值得确保您尽早测试实际的候选发布版本吗?还是您在升级过程中的某个时候再次构建,以为您会信任构建过程而不是软件?还是只是将所有内容搞砸了,然后将调试版本部署到生产中? 注意:我知道这并不真正适用于解释语言,因为您通常可以在配置中轻按开关,而不是在构建时进行切换。

2
数据库迁移和Azure部署插槽
我打算将新的Web应用程序推送到Azure Web App Service(以前的Azure网站)。我想利用部署插槽来测试我的部署,然后再将其投入生产。只要不需要更改数据库架构就可以了。但是,如果发生模式更改,则不能在同一数据库版本上运行两个软件版本。由于我使用的是EF迁移,因此将其推入暂存插槽将立即导致数据库更新到最新版本。 所以我的问题是,当需要进行数据库迁移时,是否会使用部署槽? 对于大型SaaS提供商,该如何做。他们是否正在使用新版本立即执行数据库迁移?这肯定会导致一些停机时间。 我只能想到解决这个问题的相当复杂的方法,有没有简单的方法?

4
如何学习实现一半功能的正确方法?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 我领导一个开发团队,我想尽可能多地发布我们的产品(连续交付)。 在许多情况下,我们必须实施比发布之间的时间花费更长的时间才能实现的功能。我仍然希望人们每天提交他们的代码(持续集成)。 很多时候,实现新功能需要更改现有功能,并且即使新功能尚未完成,现有功能当然仍然需要工作。 如果开发人员使用正确的方法,则他们可以仔细调整现有功能,而上述所有都不是问题。 但是,正确的方法实际上是什么?我自己的编程知识告诉我如何处理每个案例,但是我需要了解更多信息,还需要一些阅读材料,我可以阅读并推荐团队成员阅读。或任何其他学习正确方法的方法都可以。 这就是问题所在。如何确保团队成员学习实现一半功能的正确方法? 我搜寻了自称对此有策略的人,但还没有找到,只是人们对此主题写了一些随机的想法。也许我没有使用正确的搜索词,或者也许没有人对此做出任何权威性的指导。

3
构建自动化与部署自动化与持续集成
我想变得更高效,我想高效地使用操作工具。 考虑到这一点,我想了解有关持续集成的更多信息,但是似乎有很多不同的事情要涉及到。 我实际上在工作中使用Jetbrains套装(IntelliJ,WebStorm ...),所以我想继续使用它们,并且我想使用TeamCity,它似乎是一个不错的工具,带有许多用于持续集成的插件。 我的问题是我不知道它们之间有什么区别: 楼宇自动化(TeamCity是这种软件):我知道我们可以使用远程VCS存储库来构建应用程序,这很棒,但是这样做的主要目的是什么?在执行此操作时,什么样的信息很重要?实际上,我已经知道我的软件是否在本地构建,而我的团队也是如此。那么,在不部署自动化的情况下使用它的目的是什么? 部署自动化(TeamCity似乎并不容易做到) 持续集成(似乎是上述两者的结合) 持续交付(这到底是什么?为什么它与持续集成不同?) 您能帮我多了解一点吗?

4
登台和UAT环境之间有什么区别?
我知道在开发解决方案时,我们应该至少有3种不同的环境: 开发:程序员可以随时更改和推送更改,以便快速测试他们的代码并与其他更改集成,而不必担心破坏任何东西-它与TEST数据库和服务相关; UAT:开发人员应该尊重UAT,因为它应该包含有关硬件的生产环境的“尽可能好”的副本,不同之处在于该环境通过生产数据的可编辑副本连接到UAT数据库-问答团队和用户都使用它来验证将要投入生产的变更 生产:真实交易。 我在SoftwareEngineering上研究了这个问题,在ServerFault 上研究了这个问题,它们在暂存环境的含义上似乎有所不同。另外,有关该主题的Wikipedia页面指出: 暂存环境的主要用途是在将所有安装/配置/迁移脚本和过程应用于生产环境之前对其进行测试。这样可以确保对生产环境的所有主要和次要升级都能在最短的时间内可靠地完成而不会出错。 对我来说,登台等于UAT,您必须在UAT上测试应用程序和部署过程,然后才能进入现实世界。因此,我们将对UAT所做的更改以与推送到生产的方式相同的方式推送到软件包中,完全自动化,并在生产环境中进行所有应有的仪式。 话虽如此,UAT环境和暂存环境之间的适当区别是什么? - 编辑:为了清楚起见,我在考虑Web应用程序,无论是Internet网站还是Intranet网站。没有“表单”应用或移动应用。
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.