首页
学习
活动
专区
圈层
工具
发布

中国DevOps社区经典重温:持续集成(上篇)

当我向人们描述这一做法时,我通常会发现两种反应:“这里不行”和“这样做不会有多大区别”。人们在尝试的过程中发现,这比听起来容易得多,而且对开发有着巨大的影响。...确保你可以使用单个命令使用这些脚本构建和运行启统。 一个常见的错误是没有在自动化构建中包含所有内容。构建应该包括从存储库中获取数据库模式,并在执行环境中启动它。...我将详细阐述我先前的经验法则:任何人都应该能够引入一台空白机器,签出存储库中的源代码,发出一个命令,之后在自己的机器上就拥有了一个正在运行的系统。...用户通过IDE设置自己的项目文件并将其用于单独的开发是完全没有问题的。然而,有一个在服务器上可用并且可以从其他脚本运行的主干是非常重要的。...由于构建是自测试的,所以你还可以检测代码运行中的冲突,如果后一种Bug在代码中存在了很长时间而没有被发现,那么它们是特别难以发现的错误。

1.1K30

一个H2数据库Bug的定位之旅

测试其实是一个验证输入——输出的过程,所以在测试覆盖度足够高的情况下,一个功能模块的全部测试用例都能跑通就能代表这个功能是没有问题的。...问题 TRUNCATE作用是清空表或者说是截断表,会清空表中的所有行,但表结构及其约束、索引等保持不变,会重置表的自增值; 为了保证各个测试用例直接的数据互不影响,我们在每个测试用例运行之前都清掉了缓存...理论上只要清空所有的缓存,重置所有的表,就不会有数据相互干扰的问题。 在实际环境中,出现了这样一个问题: 在生产环境自动化批量跑测试用例的时候,我们发现某些用例不能运行成功,一些表的自增主键没有重置。...我第一时间想法就是空间换时间,把使用过的表放到一个容器里面,每个测试用例之前只需要遍历容器删除使用过的表,然后重新建表。...在一个有几百个表的测试环境里面,每个测试用例可能用到的表最多也就10几个,这样下来能省下来一大部分的删表与建表的时间。而消耗的额外内存几乎可以忽略不计。

85430
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    13 年的 Bug 调试经验总结

    即使if语句在概念上很简单,但当有多个条件要跟踪的时候依然很容易出错。这些天,我尝试重写代码使之更简单,以避免处理复杂的if语句。 5.Else。...例如,当我用VoIP SIP协议工作时,我写了一个能够用正是我想要的标题和值回复的小脚本。这个工具使得测试很多边界情况变得容易起来。另一个例子是可以进行API调用的一个命令行工具。...通过启动逐渐添加所需小功能,我得到了一些非常有用的工具。自己写工具的好处是,我得到的正是我想要的。 在测试中发现所有的bug,那绝对是不可能的。...所以,除非我在重新启动之前能够测试超过100次(事实是我没有),否则我在测试时就不会发现这个问题。 调试 14.讨论。帮助我最多的调试技术是与同事讨论问题。...或者,我认为软件的最新版本上正在运行,但其实是一个旧版本。因此,一定要核实细节,而不是假设。人们更容易看到自己希望看到的东西,而不是事实。 16.最近的变化。

    93050

    13 年的 Bug 调试经验总结

    即使if语句在概念上很简单,但当有多个条件要跟踪的时候依然很容易出错。这些天,我尝试重写代码使之更简单,以避免处理复杂的if语句。 5.Else。...例如,当我用VoIP SIP协议工作时,我写了一个能够用正是我想要的标题和值回复的小脚本。这个工具使得测试很多边界情况变得容易起来。另一个例子是可以进行API调用的一个命令行工具。...通过启动逐渐添加所需小功能,我得到了一些非常有用的工具。自己写工具的好处是,我得到的正是我想要的。 在测试中发现所有的bug,那绝对是不可能的。...所以,除非我在重新启动之前能够测试超过100次(事实是我没有),否则我在测试时就不会发现这个问题。 调试 14.讨论。帮助我最多的调试技术是与同事讨论问题。...或者,我认为软件的最新版本上正在运行,但其实是一个旧版本。因此,一定要核实细节,而不是假设。人们更容易看到自己希望看到的东西,而不是事实。 16.最近的变化。

    88660

    13 年的 Bug 调试经验总结

    即使if语句在概念上很简单,但当有多个条件要跟踪的时候依然很容易出错。这些天,我尝试重写代码使之更简单,以避免处理复杂的if语句。 5.Else。...例如,当我用VoIP SIP协议工作时,我写了一个能够用正是我想要的标题和值回复的小脚本。这个工具使得测试很多边界情况变得容易起来。另一个例子是可以进行API调用的一个命令行工具。...通过启动逐渐添加所需小功能,我得到了一些非常有用的工具。自己写工具的好处是,我得到的正是我想要的。 在测试中发现所有的bug,那绝对是不可能的。...所以,除非我在重新启动之前能够测试超过100次(事实是我没有),否则我在测试时就不会发现这个问题。 调试 14.讨论。帮助我最多的调试技术是与同事讨论问题。...或者,我认为软件的最新版本上正在运行,但其实是一个旧版本。因此,一定要核实细节,而不是假设。人们更容易看到自己希望看到的东西,而不是事实。 16.最近的变化。

    89660

    13 年的 Bug 调试经验总结

    即使if语句在概念上很简单,但当有多个条件要跟踪的时候依然很容易出错。这些天,我尝试重写代码使之更简单,以避免处理复杂的if语句。 5.Else。...例如,当我用VoIP SIP协议工作时,我写了一个能够用正是我想要的标题和值回复的小脚本。这个工具使得测试很多边界情况变得容易起来。另一个例子是可以进行API调用的一个命令行工具。...通过启动逐渐添加所需小功能,我得到了一些非常有用的工具。自己写工具的好处是,我得到的正是我想要的。 在测试中发现所有的bug,那绝对是不可能的。...所以,除非我在重新启动之前能够测试超过100次(事实是我没有),否则我在测试时就不会发现这个问题。 调试 14.讨论。帮助我最多的调试技术是与同事讨论问题。...或者,我认为软件的最新版本上正在运行,但其实是一个旧版本。因此,一定要核实细节,而不是假设。人们更容易看到自己希望看到的东西,而不是事实。 16.最近的变化。

    1.2K90

    13 年的 Bug 调试经验总结

    即使if语句在概念上很简单,但当有多个条件要跟踪的时候依然很容易出错。这些天,我尝试重写代码使之更简单,以避免处理复杂的if语句。 5.Else。...例如,当我用VoIP SIP协议工作时,我写了一个能够用正是我想要的标题和值回复的小脚本。这个工具使得测试很多边界情况变得容易起来。另一个例子是可以进行API调用的一个命令行工具。...通过启动逐渐添加所需小功能,我得到了一些非常有用的工具。自己写工具的好处是,我得到的正是我想要的。 在测试中发现所有的bug,那绝对是不可能的。...所以,除非我在重新启动之前能够测试超过100次(事实是我没有),否则我在测试时就不会发现这个问题。 调试 14.讨论。帮助我最多的调试技术是与同事讨论问题。...或者,我认为软件的最新版本上正在运行,但其实是一个旧版本。因此,一定要核实细节,而不是假设。人们更容易看到自己希望看到的东西,而不是事实。 16.最近的变化。

    68520

    衣带渐宽终不悔!嵌入式大牛10年调Bug经验总结

    即使if语句在概念上很简单,但当有多个条件要跟踪的时候依然很容易出错。这些天,我尝试重写代码使之更简单,以避免处理复杂的if语句。 5.Else。...例如,当我用VoIP SIP协议工作时,我写了一个能够用正是我想要的标题和值回复的小脚本。这个工具使得测试很多边界情况变得容易起来。另一个例子是可以进行API调用的一个命令行工具。...通过启动逐渐添加所需小功能,我得到了一些非常有用的工具。自己写工具的好处是,我得到的正是我想要的。 在测试中发现所有的bug,那绝对是不可能的。...所以,除非我在重新启动之前能够测试超过100次(事实是我没有),否则我在测试时就不会发现这个问题。 调试 1.讨论。帮助我最多的调试技术是与同事讨论问题。...或者,我认为软件的最新版本上正在运行,但其实是一个旧版本。因此,一定要核实细节,而不是假设。人们更容易看到自己希望看到的东西,而不是事实。 3.最近的变化。

    60011

    和各种诡异 Bug 打交道 13 年,我总结了 18 个经验

    即使If语句在概念上很简单,当它有多个条件需要追踪时,很容易出错。最近我尝试重新把代码写得简洁,避免出现复杂的If语句。...例如,当我处理面向 VoIP 的 SIP 协议时,我写了一个小的脚本可以返回正标题和值。这个工具使得测试许多个别场景变得简单。另一个例子是可以调用 API 的命令行工具。...从小的开始,逐渐添加一些需要的功能,我最终有许多有用的工具,写自己的小工具的优势是我得到我想要的功能。 在测试中要发现所有的 bug 几乎不可能。...我在处理最棘手的 bug 时,与同事讨论特别有效。 15.密切注意 往往是当调试一个问题很长时间时,是因为我做了错误的假设。...例如,我认为这个问题发生在一个特定的方法中,事实上,这个问题甚至根本不会出现在这个方法中。或者抛出的异常并不是我认为的那个。或者我认为最新版的软件在运行,但它其实是较老的版本。

    89930

    和各种诡异 Bug 打交道 13 年,我总结了 18 条经验

    即使If语句在概念上很简单,当它有多个条件需要追踪时,很容易出错。最近我尝试重新把代码写得简洁,避免出现复杂的If语句。 5....例如,当我处理面向 VoIP 的 SIP 协议时,我写了一个小的脚本可以返回正标题和值。这个工具使得测试许多个别场景变得简单。另一个例子是可以调用 API 的命令行工具。...有一次,我在一种情况下,我对处理关联号码做了改变,包括两部分:路由地址前缀(总是相同),和从000到999的动态分配号码。问题是,当查找相关性时,动态分配的数字的第一个数字在查找之前被错误地删除。...此外,即使同事不是很熟悉相应代码,常常也能給出好主意,表明哪里可能有问题。我在处理最棘手的 bug 时,与同事讨论特别有效。 15. 密切注意 往往是当调试一个问题很长时间时,是因为我做了错误的假设。...例如,我认为这个问题发生在一个特定的方法中,事实上,这个问题甚至根本不会出现在这个方法中。或者抛出的异常并不是我认为的那个。或者我认为最新版的软件在运行,但它其实是较老的版本。

    1.1K80

    持续集成(译)

    只有当这个构建成功时,我们才能说我的更改已经完成。我总是有可能错过了我的机器上的某些东西并且存储库没有正确更新。只有当我提交的更改在集成上成功构建时,我的工作才能完成。...我将详细说明我之前的经验法则:任何人都应该能够引入一台新机器,从存储库中检查源代码,发出一个命令,并在他们的机器上运行一个系统。 构建脚本有多种形式,通常特定于某个平台或社区,但并非必须如此。...在更新工作副本时构建的事实意味着您可以检测到编译冲突和文本冲突。由于构建是自测试的,因此您还可以检测代码运行中的冲突。如果后一种冲突在代码中长时间未被发现,则它们是特别难以发现的错误。...使用相同的数据库软件,使用相同的版本,使用相同版本的操作系统。将生产环境中的所有适当库放入测试环境,即使系统实际上并未使用它们。使用相同的 IP 地址和端口,在相同的硬件上运行。...因此,具有持续集成的项目在生产和过程中的错误往往会大大减少。但是我应该强调,这种好处的程度与您的测试套件的好坏直接相关。您应该会发现构建一个能够产生显着差异的测试套件并不难。

    1.2K10

    反射跨站脚本(XSS)示例

    有效负载未被应用程序编码/过滤,响应的内容类型显示为HTML: 获得的经验 - 模糊和手动测试 事实上,你看不到一个参数,这并不意味着该组件不需要一个或两个工作。...此外,我们必须在有效负载的末尾添加注释,以确保脚本被认为是正确的并被解析。Javascript是非常敏感的,如果你的脚本有错误,它不会运行!...当我们尝试注入最简单的POC负载“-alert(1) - ”时,我们收到应用程序的错误。我们被阻止了... ...不完全的。...我们注意到,appConfig是一个数组,所以通过保持相同的结构,Javascript应该是有效的和执行没有问题。...))} 关闭“try”语句的前2个括号和大括号。在许多语言中的“尝试”可以用来尝试一个函数,并在发生错误时处理错误。

    3.7K70

    AI与IDE:探索JetBrains对AI的应用

    一直以来,使用 Java 的同事都对 IntelliJ 赞赏有加,最近对 C# 的 Rider 也是如此。因此,当我得到试用 JetBrains AI 的机会时,我感到非常好奇。...生成单元测试 也可能适合,尽管不为自己的单元测试负责在某种程度上违反了敏捷规范。我个人并不喜欢在 IDE 中有示例,因为我可以直接浏览它们——但我了解有些人喜欢。...我有一个他们 AI 服务的“许可证密钥”,我将尝试将其移植到社区版或等效版本上。...ReSharper 似乎位于 Visual Studio 上,而 Rider 是一个独立的 IDE——所以我选择了 Rider,以便查看 C#。我希望 AI 服务能够连接到它;这一点没有完全说明白。...在开始时这样做似乎很明显,但我见过太多产品没有给予自己的服务足够的关注。JetBrains 在我注册后给我发了电子邮件,让我创建一个帐户,并为我提供了免费许可证用于测试。

    42910

    FitNesse - 完全集成的独立wiki和验收测试框架

    1、前言 在软件开发与测试的流程中,业务团队与技术团队的协作壁垒、测试文档与实际执行的脱节,往往是影响效率的关键痛点。...而FitNesse的出现,恰好为这些问题提供了一体化的解决方案—这款融合了wiki协作功能与验收测试框架的工具,正以其低门槛、高适配的特性,成为跨团队协作与软件测试的桥梁。...三大核心属性: 作为协作工具,因是wiki网页服务器而具有低入门和学习门槛,便于与业务相关方协作; 作为测试工具,在其上创建的wiki页面可作为测试运行,能依据应用程序验证规格,实现规格与实现的循环反馈...2、点击测试标题,进入编辑页面,编写测试用例。 表格类型: 决策表(Decision Table),每一行代表一个完整的测试场景(含输入与预期输出)。...表格列定义: 输入列:numerator(分子)、denominator(分母),用于填写测试用的输入数值; 预期输出列:quotient?,列名中的?

    17610

    Go Testing By Example--Russ Cox在GopherCon Australia 2023的演讲

    当我们运行测试时,它通过了,现在我们有100%的覆盖率,很好,我们完成了吗?...当我们运行这些测试时,它们会失败,返回的索引i是正确的,但指示是否找到目标的布尔值是错误的。...这很像是表驱动测试,只是我们解析文件而不是遍历表格。它不适合放在一个幻灯片上,但开发时确实可以放在一个屏幕上(译者注: 这后半句未解其意)。 Tips9....当该标志为true时,测试会将计算出的答案写入答案文件,而不是调用 diffJSON。 现在,当我们有意更改 JSON 格式时,go test -update 会更正所有答案。...随着我们积累更多的经验,我们可能会把它移到一个更正式的地方。如果你尝试使用它,请与我分享你的进展。 们提取脚本引擎的动机是为了在 Go 命令测试的不同部分中重复使用它。

    72810

    万能 Java

    不到一年时间,几件事情让我的想法来了一个180度的大转弯: 在一家公司里,我写了一个模拟器,这样就可以让我的 Java 服务独立运行而无需一个全功能的网站。...在这个模拟器中,我运行一些脚本测试包括失败在内不同的情景。...但在大约两周开发之后,当我们都需要增加一个功能时,我花的时间最多和你一样,而且我不需要在如何让我的系统应对大量用户上花费任何时间,或者追踪那些令人困惑的无效语句,其原因只是你的一个函数名拼写错误导致语句执行中断...错误的工具呀!还是使用 Java 吧。如果你觉得在 shell 上运行命令显得很愚蠢,编写一个工具函数就可以解决这个问题。...但是你知道吗,Java 是一门相当好的语言,当我进行代码编译时,往往在第一时间,它通常会正确地运行。任何其它语言都没有像 Java 那样给予我心灵上的宁静。

    1.2K30

    改善 Kubernetes 上的 JVM 预热问题

    当我们在印度市场上运行一个这样的服务时,我们第一次遇到了这个问题。我们通过负载测试进行了通常的容量规划过程,并确定 N 个 Pod 足以处理超过预期的峰值流量。...这样就解决了问题,尽管我们的运行容量是稳定状态所需容量的 3 倍,但我们能够在我们的服务中或任何相关服务中没有问题地进行部署。 随着后面几个月里更多的迁移服务,我们开始在其他服务中常常看到这个问题。...我们的想法是运行一个预热脚本,向服务发送几分钟的综合请求,来完成 JVM 预热,然后再允许实际流量通过。 为了创建预热脚本,我们从生产流量中抓取了实际的 URL。...我们在预热机制上做了一些调整,比如允许预热脚本和实际流量有一个短暂的重叠期,但也没有看到显著的改进。最后,我们认为预热脚本的收益太小了,决定放弃。...这允许我们使用集群中的冗余的资源(足够可用时)来解决预热问题,而不需要任何额外的成本。 最后,进行假设测试。我们更改了资源配置并部署了应用程序,成功了!我们做了更多的测试以验证结果一致。

    1.4K20

    关于apple上架常见问题汇总

    在 Apple 拒绝后上传我的应用程序的新版本时,如何更改上传的版本号? 当我尝试上传修改后的应用程序时,它不允许我并且我收到一条错误消息“ 错误 ITMS-4238:“冗余二进制上传。...在 SoftwareAssets/PreReleaseSoftwareAsset 中已经存在构建版本为 '1' 的二进制上传,用于训练 '1.0'” 错误 ITMS-4238:“冗余二进制上传。...我正在尝试将持续集成添加到我们当前的应用程序构建部署过程中。...我已经添加了一些单元测试并在外部存储的 mac mini 上配置了 xcode 服务器,以便在推送到 github 时构建和运行测试——一切都很好。...我希望 xcode 服务器为我上传我的构建,但如果需要,我会设置 fastlane 来执行上传过程。但我感到 困惑的是为什么机器人将其作为错误返回。

    1.2K10

    改善 Kubernetes 上的 JVM 预热问题

    当我们在印度市场上运行一个这样的服务时,我们第一次遇到了这个问题。我们通过负载测试进行了通常的容量规划过程,并确定 N 个 Pod 足以处理超过预期的峰值流量。...这样就解决了问题,尽管我们的运行容量是稳定状态所需容量的 3 倍,但我们能够在我们的服务中或任何相关服务中没有问题地进行部署。 随着后面几个月里更多的迁移服务,我们开始在其他服务中常常看到这个问题。...我们的想法是运行一个预热脚本,向服务发送几分钟的综合请求,来完成 JVM 预热,然后再允许实际流量通过。 为了创建预热脚本,我们从生产流量中抓取了实际的 URL。...我们在预热机制上做了一些调整,比如允许预热脚本和实际流量有一个短暂的重叠期,但也没有看到显著的改进。最后,我们认为预热脚本的收益太小了,决定放弃。...这允许我们使用集群中的冗余的资源(足够可用时)来解决预热问题,而不需要任何额外的成本。 最后,进行假设测试。我们更改了资源配置并部署了应用程序,成功了!我们做了更多的测试以验证结果一致。

    1.2K20

    EdgeOne安全专项实践:上传文件漏洞攻击详解与防范措施

    而当我们讲解完攻击之后,我还会分享一些防范措施,以保护您的服务器免受攻击。因此,本文的焦点依然集中在腾讯云的EdgeOne上。...> 当我们谈论获取信息的用处时,是否可以用于攻击?实际上,我们的主要目的是执行脚本。对于脚本的内容并不重要,关键是能够顺利执行。你可以随意替换脚本的语句,例如像蚁剑的一句话脚本来获取shell。...当文件内容实际上是PHP脚本时,尽管我们的文件后缀被设置为.jpg并不属于敏感后缀文件,因此可能可以规避EdgeOne的后缀规则检查。因此,我们可以尝试上传并查看是否能够成功执行。 尝试并未取得成功。...那么,当我们测试更高级的伪装文件时,比如在一个看似正常的图片文件中嵌入代码脚本,防护规则是否能够检测到它们呢?...当我们继续发送并发请求进行测试时,可以观察到EdgeOne已经能够识别到后续请求,并且使用了JavaScript挑战脚本,而非直接由服务器响应。 当我们检视样本日志时,同样可以观察到这一情况。

    839101
    领券