在移动码库上更改轮胎

2021-03-11 07:44:27

2020年是一年的估计。对于所有超出One'Scontrol的全部,当年,我发现自己倾注了更多和更多的内容,这是达到的一件事

现在完成,这款重新形成在我最复杂的商品中轻松排名,现在,持续最幸福的产品。这种幸福以成本为付,但有一些正确的成本可能不会像你想象的那么高。

我们采取了SimpleEleTegal的主要产品,A30,000线Django-1.11-Python 2.7-Redis-Postgres-10 CodeBase,to Adjango 2.2-Python 3.8- Postgres-12堆栈,按时间表和没有Majorsite事件。它感觉很棒。

作为技术领先的项目,它看起来像什么?对我来说,这样的东西:

但作为工程总监,它的价格是多少? 3.5 Deventrand,每行代码只需2美元。

而且我特别为此结果感到骄傲,因为沿途,Wealso大大提高了Siteand开发过程本身的速度和可靠性。该产品现在有一个明亮的Futureahead,准备在销售RFP和Uncleancequestionnaires中发光。最重要的是,没有担心Whento欺骗它,他们将其担任他们将在营业的技术工作。

简而言之,已经为自己付出了很大的坚实投资。如果你刚刚来到这里来估计我们希望我们有,你'镶嵌它。这篇文章是关于您的团队如何实现素材的措施,如果不是更好的话。

故事始于2013年,当时一个新的YC孵化的SimperElegal Madeall为新SaaS Leggredech公司的正确决定:Python,Django,Postgres,Redis。在经典的创业时尚中,功能集中了,除非技术是拦截器。套餐只逐步升级。

到2019年,这个技术跑道的尽头临近。虽然Python2可能是从各种供应商的扩展支持,但在2021年,有很多志愿者在2021年做Django 1 CVE补丁。Aweb框架是一个冒险的攻击面,所以我们终于有了我们的技术,并且是时候回报了我们的技术债务。

因此,开始我们的技术刷新更换倡议,在2019年第四季度.Thogal:升级堆栈,同时仍然运输功能,如改变移动车的轮胎。我们想仔细地做到,而且会花时间。以下是长期运行的一些有用的基础规则:

任何在每周10小时内工作的项目都应该每周30分钟同步。

每次经常性会议都值得一个日志。把它放在邀请里。使用该项目日志记录进度,阻止者和决策。

这是一场马拉松,而不是冲刺。避免依靠工作夜,周末和假期。

我们从一个计划的草图开始,慷慨地解释,结束是大约一半的正确。一些早期的猜测转动了Intosocesses:

基于广泛的更改分析,转移到PIP工具和取消依赖性。识别没有PY23兼容版本的包。 (虽然我们自移到诗歌以来。)

在美国周围使用低交通时间(感恩节,圣诞节,新年)逐渐滚到2021年之前的新应用程序。

我们很年轻!像我们一样天真,至少我们知道这将是一项工作。为了帮助承担负担,我们被侦察,雇用和训练了专门的偏离岸上开发人员。

即使增加了开发人员,在2020年代中期,它就会成为明显的Wewere梦想覆盖率约为95%,更不用100%。总覆盖范围可能是最佳实践,但3.5个开发人员无法覆盖足够的地面。我们越来越有价值的测试,甚至发现旧虫子,但如果韦斯克与该计划的信,Django 2最终会成为2022project。在70%以上,我们决定是时候枢转了。

我们意识到CI比大多数用户更敏感。所以我们专注于测试最高的影响码。什么高兴的影响? 1)最亮起的代码和2)代码代码最难重试。您可以通过查看交通统计,批量作业计划和询问您的支持人员来构建一周内的高影响力的库存。

大约80%的Codebase落在了高流量/高撞击列表之外。怎么做这个80%?依靠错误检测和快速固定。

关于初创生命的一个好事就是很容易尝试纽托尔。我们以SimpleElegal拥有的一项练习是为开发人员预留每五周,以便在开发过程本身上工作,如协调的20%。即使是最好的厨师也不能在一个凌乱的厨房里烹饪五星级。这是我们清理店铺的方式,以及加速船的店铺。

在一个这样的时间段内,有人有一个天才想法,可以使用sentry向系统添加专用交耳。在一两天内,我们有一个网站您可以访问并获得堆栈痕迹。这是非常神奇的,它没有明白技术刷新,我们意识到,虽然整合需要在日常日,完全采用可以参加团队月。

你看,将sentry添加到成熟但快速移动的系统意味着噪音。我们的直播网站一直错误。大多数错误都不可见或阻止用户,谁在某些情况下悄然地终止了长期的遗址怪癖。很快,我们已经学会了将哨兵视为调试信息的存储库。在2019年,自己的哨兵事件并不是要发动的事情。这是2020年改变的,该团队负责迫切需要哨兵的无缝的重量,以其他方式成为其他东西:一个响应的网站质量工具。

我们是如何到达那里的?第一步,增强了以下最符合这些备注的数据流入哨兵:

标记您的版本。不要使用分支标记Dev Env部署,它抑制了释放UI。为搜索添加单独的分支标记。

分开您的环境。这对于指导警报至关重要。我们的Sentry客户端环境由域约定和Django的网站框架配置。如果它有助于,这里是一个基线,我们使用这些环境:沙箱:当前的官方发布(一些公司做下一个版本)。客户使用客户来测试更改。 Devops监控。

演示/销售:以前的官方发布。主要是内部流量,但前景演示时的外部可见性。 Devops监控。

通过问题最终标记和可搜索,我们使用Sentry'snew Discover Toolto每周导出问题,并优先考虑遗留错误。要开始,我们使用非内部人文人员的高可见性生产错误。我们的特定查询:具有:用户!事务:/ api/*Event.type:错误!user.Username:* @ simpleLegal。*

我们将三类分为4个类别:快速修复(次要错误),快速错误(Turnan Opaque 500错误,以某种形式的可操作400),尖峰(较大的错误,QuancEsearch)和沉默(使用Sentry的忽略功能)。超过6周的每周比每周2500多个活动降至低于500。

进一步的努力每周100次活动,蔓延的一些问题,这甚至不仅仅是艾伦队。 "哨兵零"仍然是理想的,我们实现了一个响应流的真正目标,大部分归功于松弛的集成。 OUTEAM不再听到我们支持团队的服务器错误。 infact,这几天,我们让他们知道当客户遇到麻烦时,我们会在进行一张票。

与支持河流一起开发密切联系真的很重要。嵌入我们上面的策略是CI比真实用户更奇异。虽然完美诱惑,但是,询问企业用户的一点耐心,提供了一支我们的支持团队。每周与他们同步,这么令人惊讶地是isminized。如果他们感觉雄心勃勃,你也可以教他们Somesentry基础。

噪音几乎消除了,我们准备好快速移动。虽然TheLean-in快速定制的哨兵问题是必要的,但如果存在主动变化,则强烈的反应次数仅用。以下是我们在制作这些变化时学到的一些亮点:

使用得当,回滚可以使其类似于从未发生的错误,弗费地补充了快速修复的策略。

尽可能多地进入交易。如果你还没有,请打开atomic_requests。但有些请求不仅仅是更改账单,例如发送通知和eNuduing backgroundtasks。

在SimpleLegal处,我们首次搜索为推迟所有副作用(除外),直到返回成功的响应。 MiddlewareCan帮助,但主要是我们通过摆脱我们的重款,并切换到PostgreSQL支持的任务队列/经纪人。 ThisArrangement确保如果发生错误,则会回滚事务,延长任务,并且用户会获得干净的故障。 Wespot在哨兵中破损,切换到旧网站以解锁,他们的下一次重试成功。

交易性也证明了我们的测试策略的关键。 SimpleLegalhad Long LiftLown Django的原始夹具系统。大多数TestSrequired Complex Python设置,使测试慢写和慢跑。要加快写作和运行,我们将在交易中包装的全部会话,然后,在任何测试用例运行之前,我们设置了示例性基本状态。测试用例使用这些基本状态作为夹具,并在每个测试用例后滚动到基本状态。看到这个conftest.pyExcerptet的细节。

软件方案广泛变化,有一颗艺术来了解哪种不适合您。这是第一手学习的各种各样的CUL DE SACS。

鉴于如何分为模块,软件包,Django应用程序等,可能会诱人将那些作为工作单位视为。不要锻炼。代码分区可能是非常任意的,并且很难知道你已经拉动了一个冒险的线程。

假设存在自动重构,如2to3Conversvers中,开始按类型的转换类型。这样,只需要评论Acommand和受影响的路径列表。此外,自动审理遵循模式,意味着更多人可以修复重构的错误。

覆盖范围是我们的混合袋。显然,我们的覆盖范围 - 首先是不可统一的策略,但它仍然有助于优先级和地点。在每次变更的基础上,我们发现覆盖工具有一些不再努力。我们从来没有到底,为什么覆盖着追求行为术语,我们离开了结论,“像Codecov这样的避难室可能没有针对我们科斯科尔的莫雷斯佩尔。”

在跑进覆盖墙壁时,我们最终探索了许多其他覆盖的诠释。对于我们来说,比LineCoverage更高的优先级是“路线覆盖”(即,每个URL至少有一个单融体测试)和“模型ROP覆盖”(即,每个模型对象都有一个有用的文本表示,可用于调试insetry)。随着时间的推移,我们将希望在线构建工具,甚至在线划分的基于在线覆盖统计数据,拓展最高的交通线,而不仅仅是最高的交通规局。如果你已经听说过关于这些目的的方法,我们会喜欢和你一起努力。

在表面上,减少我们需要升级的文件数量逻辑。事实证明,展平移出迁移是摆脱文件的低收支付策略。更改StageSmigration文件结构复杂于我们的卷展栏,而我们没有平坦的升级是直截了当的。更不用说,如果你只是想要CI加速,你可以从Theopen Edxplatform那里采取同一个页面:建立一个你检查每个耦合的基本数据库缓存。

如果您有多个应用程序,请使用较小的,简单的应用程序来导频更改。我们很幸运能够拥有一个速度更快的分离,这是针对更严格的开发循环的武器学习。同样,如果您有多个生产环境,请使用最小的影响力启动卷展览。

克隆您的CI工作,为新堆栈。他们都会失败,避免将它们标记为可选的冲动。相反,构建所有测试和当前测试状态的单个文件录音。我们为我们的Test Runner,PyTest构建了ASMALL扩展,批量跳过了状态库存文件上的TestSbas。然后,ratchet:unskip和fix最优先,更新文件,检查测试通过,然后重复。比PyTestMarkDecorators在整个Codebase中传播的兴坏和扫描。看到这个conftest.pyExcerptet的细节。

在2020年的Q4,我们在基础架构上加倍,以并行运行旧和新闻,由同一数据库备份。我们进入了新堆栈的循环,建立了Sentry Issuesto修复的队列,并在跟踪时间后切换回来。浏览120小时的新堆栈,战略性地传播钟声周,已经建立了足够的组织信心,这在我们最关键的时间内不会在我们最关键的时间内离开网站:星期一和星期二在月初。

唯一的打嗝是一周的一个尴尬。此时,我们提前提前,我们的快速修复工作流程建立了足够的信息,我们没有要求原始的假期测试窗口。为此,谢谢谢谢。

我们保持在快速修复的曲柄,直到我们完成。完成的OWSN' t当时系统没有错误,它' s当新系统的流量超过旧系统时的流量。然后,修复前进,并开始删除脚手架的时间。

所以,一旦你在当前的LTS版本的Django,Python,Linux,AndPostgres,就业完成,右边?

值得庆幸的是,技术债务从未相当命中0.在更新和更换时间表的情况下,在时间表上没有小小的壮举,用闪亮的人更换rustypart不会改变设计。建筑技术债务 - 抽象中的错误,包括缺乏缺乏 - 可以呈现更大的挑战。解决这些问题的解决方案在项目之间不成一项,但他们确实可以从迄今为止到日期和无错误的基础中获益。

对于寻求将胎面添加到其技术轮胎的所有项目来说,我们追溯到您的回顾可以自信,并将您的堆栈谨慎地帮助您多年。 最后,感谢UVIK为天赋,和人才:雅罗斯拉夫,Serhii和Oleh。 我的Fellowleads的kurt,贾斯汀和克里斯郡喊道。 为SimpleLegal yestevery的企业领导的欢呼声,以了解可维护性的价值。