Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Etsy 的移动应用持续部署实践

Etsy 的移动应用持续部署实践

作者头像
DevOps时代
修改于 2017-07-21 07:10:48
修改于 2017-07-21 07:10:48
9200
举报

翻译者:乐视 SCM 高翻院 石雪峰 校对:叶赫华、黄华、刘慧美

Etsy 是如何利用 web 持续部署实践来改善 App 发布流程的

1、起航

代码部署应该简单且频繁,研发工程师需要参与整个部署流程,对于Etsy web而言意味着秉持持续部署的核心实践。对于日常发布而言,会有一组工程师和一名专职的发布经理共同监督所有变更被成功部署到准生产环境和生产活动,在发布流程的每一个检查点,团队成员会对他们的变更负责,保证不会破坏代码质量,确保其可以随时发布。

所有人必须紧密配合保证每次部署都安全完成,而在 Etsyweb 这是一个频繁发生的事情,有时甚至每天会有超过50次的部署。

这种策略奏效主要归因于每次部署都是由最熟悉变更的成员直接完成,那些直接负责这些模块代码的开发工程师可以很容易发现并解决软件中的问题。因此,开发人员应该被授权根据需要部署代码,且代码的顺利部署保持关注。

而对于一个 App 的发布而言,会有一些不同的地方,代码部署的方法就不太适用了。其中一个主要的原因就在于 App 有版本迭代和编译的完整过程,同时 App 需要通过 app store 或者 google play 进行分发,所以需要花费些额外的时间才能真正到达用户。

一般来说,由于 App 发布的这种特性,团队会倾向于引入发布分支和发布经理来管理这个流程。而我们的 App 最早也是沿用类似策略,可是很快我们发现这样的做法不太像 Etsy,所以我们决定是时候进行改变了。

2、发布经理

我们两个曾经是 Etsy 的发布经理,Jen 负责 Sell on Etsy ,而我负责Etsy。我们的职责包括:所有发布阶段流转,维护发布计划,管理所有发布环节中的协同沟通,解决冲突以及跨团队调配资源来应对紧急发布中的问题修复。

2.1 准备发布

我们的工作重在使个人各施其职,按部就班。每个发布时间点也是我们最需要注意的评审点,此时需要组建专门团队负责此阶段功能集成到主产品,轮流进行迭代。阶段发布需要按计划进行,并且保证到达特定发布阶段时会完成某些变更。重要的是,那些变更是意料之中且已经测试过的。

仅仅依靠 Jen 和我来追踪所有在这次发布中的变更是一件非常困难的事情,所以我们的任务之一就是协调所有作出变更的工程师保证他们的改动符合预期且验证通过。在实际操作中,这意味在特定检查点(比如拉出发布分支的时候)需要发送大量的邮件和信息用于沟通。当然在紧急报警发生的时候,我们同样需要及时知会相关人员。

后来 Jen 离开了 Etsy 寻找更好的机会,而我就成了唯一的发布经理,所有发布的决策都需要通过我来完成,也只有我能作出和执行这些决定,我俨然成为了发布系统中的那个容易导致单点失败的瓶颈。

这令我压力山大,手足无措,我担心自己会陷入无尽的上传 iTunes, Goolge Play 和发邮件的工作中,这也并非是我期望的工作内容。我希望这些繁琐的任务都可以自动化,只需要一个按钮就可以完成,想到web部署时候的轻松惬意,这让我很是羡慕。

即使回到我们两个发布经理的时候也并不轻松,从工程师的角度来说,这个阶段的 app 发布一点都不透明。他们很难知道当前的发布阶段,每天都接收大量的邮件,但只有很少部分才是他们真正关心的。我们仅仅是把邮件发给4个应用。

开发人员的群组,内容混淆了FYI类的邮件和真正需要紧急处理的case,这让我们陷入了“狼来了”的困境。

所有这些问题都会让工程师感觉自己像机舱里托运的货物,而不是驾驶员,这完全不符合我们之前web部署的原则,也不符合我们的研发处世哲学。我们并不喜欢这样,他应该变得更好,让工程师从被动变为主动。

3、发布

所以我们打造了一个管道来协调app发布过程中的状态,计划,沟通以及工具,他有几点好处:

•保持跟踪谁做了哪些修改

•发送必要有效的 Slack 消息和邮件给需要的角色

•管理所有发布的状态和计划

为了让这些抽象的概念更加容易理解,我们可以看个例子:

3.1 队长日志

Alicia 在 IOS app v4.64.0 版本上完成了第一次提交

Ship 获取了这个消息,自动发送给 Alicia 一封 v4.64.0 版本欢迎邮件 .

译者注:Ship是一个自动化系统

周一

•自动任务将发布流转到测试阶段,并自动编译出测试版本 v4.64.0.52.

•Ship 获取了这个消息,并发送 一封版本编译完成邮件给 Alicia.

•Alicia 安装这个版本并验证她的改动,并回复给 Ship 这个问题已经 OK

周二

•所有人完成自己改动的验证,并 反馈成功状态.

•自动任务完成发布分支的创建和预发布版本的准备工作

•Ship 获取了这个消息,并 给验收测试团队发送一封邮件.

周三

•验收测试团队报告没有发现严重问题

•自动任务将 v4.64.0 版本提交 iTunes Connect 审核

周五

•自动任务检测到 iTunes Connect 的审核结果,同通知 Ship 本次发布已经获得批准

•Ship 发送邮件给 Alicia 和所有改动负责人,通知本次发布已经获得批准

周二

•自动任务正式发布 v4.64.0.

•Ship 自动邮件给 Alicia 和所有改动负责人,通知本次发布已经正式到生产环境

周三

•Ship 发送一封 crash 报告给所有本次发布中的负责人

在 Ship 诞生之前,所有以上这些工作都需要手动完成,但是你也许会发现,当一切都自动化之后,是不是发布经理这个角色就被脚本所取代了,Ship 变成了我们的发布经理?

3.2 发布司机 Release Drivers

只说对了一部分,实际上Ship有一个功能将每次发布分配给一个发布司机(Release Driver)。

司机的职责在于一系列无法自动化或者 不应该自动化 的工作,包括: •安排变更计划

•跟踪监控所有工程师变更都达到准备发布的状态

•跟踪解决所有发布前的严重问题

其他的事情呢?全部是自动化完成的!分支拉取,候选发布版本编译,提交 iTunes Connect — 甚至启动发布到 Google Play!

当然,我们也受到 automation going awry 这篇文章的启发。有一些工作默认是编排为手动执行的。同时还有一部分工作在 Ship 中是明确定义为禁止自动完成的,比如Google Play的正式发布。

这样的工作需要人为干预,除此之外尽量实现自动化。当然我们还有一个安全控制机制,在任何时候发布司机都可以停止所有自动任务,切换到手动驾驶模式。

当发布司机希望手动处理一些工作的时候,他们并不需要手动访问 iTunes Connect or Google Play,这些工作都被很好的封装简化到一键完成。这么做的好处是,我们完全无需担心发布配置被所有人获取,包括设备号,认证签名等,同时在后台我们保存了一份清晰的日志来记录所有发布司机的行为。

在主线分支进入下一个发布周期的时候,我们会采取半随机的形式来选举新的发布司机,范围是上一个周期中参与到代码提交活动的工程师和发布司机。当选举完成后,我们会自动发送一份通知邮件到这位幸运儿,告知他所要承担职责:

3.3 准备再次发布

其实在发布分支被正式拉出之前,新一任司机基本都无需跳到前台,在发布分支创建前几个小时,就需要他正式登场啦,首先要确认所有本次待发布的改动已经准备就绪,同时评估那些尚未完成的工作事项的详细计划。当一切就绪后,司机仍然要作为主要接口人来跟踪验收测试,如果发现任何问题,那么他就需要推动解决。

假设一切顺利的来到发布当天,司机可以选择手动发布,或者安排自动任务,如果自动任务过程中出现问题,会自动通知出来。在发布之后,司机会关注可视化看板,日志,图表来确认本次发布的健康程度。

修复Bug

并非所有发布都是计划内的,意外总会发生,这才是 意料之中的. 假设严重问题不会随版本发布出去过于天真,事实上会有各种各样的问题需要我们 事后应对。当问题出现时,任何工程师都可以快速的基于最近一次正式发布的基线修复问题。

研发工程师会通知发布司机请求集成这个改动。当他们拉出新的发布分支时,所有必要改动会集成进来,只要获得发布司机的同意,其他人也可以这样做。之后的流程跟正式发布一致,编译待发布版本,安排验收测试,推送生产环境,一切尽在发布司机的掌握之中。

4、发布状态机

诚然,版本的发布是一个异常复杂的过程。

他起源于一个抽象的发布计划,之后便开始一系列具体的工作,提交代码改动到主分支。代码改动完成后则进入下一个阶段拉出待发布分支。编译待发布版本并跑通验收测试,并投放到生产环境,之后发布分支的生命周期就会结束。

当拉出发布分支后,下一次发布任务即刻在主分支启动,周而复始,每一次发布都有自己的发布状态机,帮助开发和发布工作有节奏的交替进行。

4.1 通知:Slack和Email

通知机制覆盖整个发布周期,因为整个过程中有太多信息。让合适的人在合适的时间收到合适的通知是非常重要的。所以我们使用发布状态机来通知工程师,以及其他订阅消息的人员,这取决于他们的需求以及他们对本次发布的影响。

我们提供了订阅机制,允许发布过程中的通知订阅,这对于产品经理,支持团队,工程团队都有帮助,我们的通知机制正是基于主动订阅的方法来设计的。

根据订阅,我们会在状态转换的时候发送通知邮件,以保证邮件中覆盖必要信息。

至于如何判断对本次发布的影响大小,我们需要其他途径来获取这些有效数据。

5、Git

我们提到 Ship 需要通过其他途径来获取数据,在 Etsy,我们使用GitHub作为代码版本控制系统,我们的app会基于平台(Android,IOS)来构建。为了保证 Ship 的数据及时准确,我们添加了后台脚本 GitHub Webhooks ,检测到 master 分支推送和发布分支推送的时候,会自动通知Ship。

当 Ship 获取到这个消息后,他会遍历提交,记录作者,保存本地提交路径,提交信息以及受影响的 App 和影响版本。Ship 会统计分析这些数据,来评估影响哪些工程师会出现版本影响人员列表,这个列表会作为邮件通知的重要依据,以保证关联人员可以及时获取信息。

此外,在发布过程中,工程师可以登录改变他们的通知状态,他们往往是因为需要获取更多版本信息,或者 Ship 错误识别了代码改动信息,并把他们添加到了不需要的版本通知列表中。

6、Deployinator

以上我们已经说明了在内部Ship是如何跟踪状态的机制,但还没有提及自动任务是如何同外部系统协同工作的,以及他如何影响Etsy的开发流程。

我们研发了一套管理部署平台 Deployinator 来提供 App 发布支持。他可以实现同 Google Play and iTunes Connect的发布交互,这是我们用来编译待发布版本,发布,创建分支,提交 iTunes Connect 等一系列任务的作业平台。

我们采用 Deployinator 基于几个以下几个原因:

•Etsy 的工程师非常熟悉这个平台

•通过一键操作封装复杂的发布过程操作

•便捷的日志提取和错误追踪功能

在我们的系统中采用了 cross 任务,他帮助我们在周二晚上拉出发布分支,也帮助我们接口 Google Play and iTunes Connect,我们使用官方API通过 Python 模块实现访问 Google Play,至于 iTunes Connect 我们使用 Spaceship 来实现非官方的 API 的调用。

7、适航 Seaworthy

构建Ship的目标是让他成为我们的发布经理,从此 Etsy 不再有专职的发布经理角色,任何人都有可能成为这个角色,包括我也不时的参与到发布工作之中。

人的作用不可能被自动化完全取代,这对于 web 部署和 App 发布殊途同归。我们的流程之所以独特,就在于不断穷尽我们所能想到的所有事情,并让他变得自动。与此同时,赋予研发工程师相比从前更多的职责,让研发工程师来完成部署上线,决策是否拉出分支,工程师来亲自上阵,点击按钮发布版本。

而这才正式 Ship之所有存在的核心期许,他让我们的工程师交付最好的 App 给我们的用户,让工程师走向前台,职责共担,激发更大的热情和责任感。

译者注:有效价值的快速持续交付是 DevOps 的终极目标,组织和文化的改变往往比工具层面的演进更加重要,打破部门墙和组织边界的关键在于职责共担,Etsy 正是通过极尽的自动化,简化原本复杂而专业的事情,让人人成为发布经理,当工程师真正站在产品的角度意识到他的每一次改变都能带来价值的时候,行为的改变潜移默化的带动文化的改变,从而使这样一家公司迸发出更多活力,成为研发效率领域的明星。

Posted by Sasha Friedenberg on May 15, 2017

文章来源:DevOps时代社区

本文系转载,如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
DevOps研效:TestX 持续测试中开发实践赋能
导语:DevOps时代下,要想构建能够支撑起数字化转型要求的研发能力,与之适配的测试能力必不可少,打破以往项目内产品、开发、测试团队各自为战,认知存异的窘况,通过测试前置、打通自动化、测试贯穿,真正意义上提升团队研发效率和质量。本文将 TestX - 测试协同团队结合自身产品能力,经过探索和实践总结出一套高效高质开发工作流分享给大家~
feekia
2023/02/27
8120
DevOps研效:TestX 持续测试中开发实践赋能
你以为搞个流水线每天跑,团队就在使用CI/CD实践了?
在实践中,很多团队对于DevOps 流水线没有很透彻的理解,要不就创建一大堆流水线,要不就一个流水线通吃。实际上,流水线的设计和写代码一样,需要基于“业务场景”进行一定的设计编排,特别是很多通过“开源工具”搭建的流水线,更需要如此(商业的一体化平台大部分已经把设计思想融入自己产品里了)。
DevOps在路上
2023/06/10
1.4K0
你以为搞个流水线每天跑,团队就在使用CI/CD实践了?
回归测试的实践与思考
上周写了一篇关于测试过程效率演变的文章,其中聊了很多过程改进的方法。比如:需求阶段应该做好评审和风险预案;研发阶段应该做好质量卡点,持续集成流水线以及为研发自测做好辅助工作;测试阶段的重点是测试计划和质量门禁,同时关注线上的发布质量,通过线上巡检和监控,持续提升测试过程效率和最终的交付质量。
老_张
2023/10/23
4240
回归测试的实践与思考
XXOps实践:持续发布和部署
上周分享了一篇文章《有了CMDB,为什么还要应用配置管理》,主要讲了基础层面应该怎么做,那基础的东西做好了,如果用不起来,就没有价值,那我们今天就来看看在此基础之上的一些实践。
赵成
2018/08/09
6580
XXOps实践:持续发布和部署
持续交付之如何选型代码分支策略?
高效的持续交付体系,必定需要一个合适的代码分支策略。采用不同的代码分支策略,意味着实施不同的代码集成与发布流程,这会影响整个研发团队每日的协作方式,因此研发团队通常需要很认真地选择自己的策略。
高楼Zee
2021/03/16
2.1K0
持续集成、持续交付、持续部署 的区别与关系
持续集成 尽可能快的把不同开发人员修改的代码集成到一起,通常一天进行多次 需要结合自动化单元测试,每次集成都运行一整套单元测试 目标是尽快发现代码问题 持续交付 持续的把改动的代码交给预演环境,接受QA检查,确保此套代码是可以随时部署的 持续交付比持续集成更进一步,持续集成是代码层面的测试,持续交付不仅把代码集成起来,还会把真实环境中需要的配置信息设置好,在预演环境中运行起来,进行整体业务逻辑检查 目标是保证代码处于可部署状态 持续部署 把所有通过测试的代码尽快部署到线上产品环境 持
dys
2018/04/03
1K0
持续集成、持续交付、持续部署 的区别与关系
发布、部署,傻傻分不清楚?从概念到实际场景,再到工具应用,一篇文章让你彻底搞清楚
部署和发布是软件工程中经常互换使用的两个术语,甚至感觉是等价的。然而,它们是不同的!
DevOps在路上
2024/02/04
1K0
发布、部署,傻傻分不清楚?从概念到实际场景,再到工具应用,一篇文章让你彻底搞清楚
敏捷测试价值观、方法和实践读书笔记(3)
Richard Knaster 和 Dean Leffingwell 在《SAFe4.0精粹:运用规模化敏捷框架实现精益软件与系统工程》中提道:“企业的领导者必须拥抱精益-敏捷”思维。如果领导者只是通过语言而不是自身的行动来支持“精益-敏捷”思维人们很快就会认识到他们不是在全心全意地推动变革。他们必须知晓方法,强调终身学习需要用新的行为践行这些价值观、原则和实践。所以在规模化敏捷 SAEe的系列培训课程中,专门有一门课程叫作Leading SAFe,主要对管理层和主管级别以上的领导进培训。
顾翔
2024/09/10
1270
敏捷测试价值观、方法和实践读书笔记(3)
持续性能测试与持续集成持续发布之间的关系
在维基百科中的定义为:一种软件工程流程,是将所有软件工程师对于软件的工作副本持续集成到共享主线的一种举措。它一般是指开发工程师在对代码进行修改并提交后,通过标准化的构建操作及单元测试,在没有异常的情况下,变更代码就会合并到主干流程。
漫谈测试
2024/12/05
1450
有赞零售移动CI/CD实践
随着有赞零售业务的蓬勃发展,为了尽早交付有价值的应用满足客户需求,我们采用了敏捷开发的模式,快速拥抱变化的同时保持竞争优势。从 2019 年起,零售客户端的发版周期更改为每周一次,这对移动端的持续集成与交付提出更高的要求。如何根据现有的团队规模,在有限的资源下,快速搭建稳定可靠的持续集成与交付系统,我们有了自己的实践与思考。
有赞coder
2020/09/01
1.3K0
有赞零售移动CI/CD实践
持续反馈如何反作用于持续交付和持续集成?
作者简介: 梁定安 腾讯织云负责人,目前就职于腾讯社交网络运营部,开放运维联盟委员,腾讯云布道师,腾讯学院讲师,EXIN DevOps Master讲师,凤凰项目沙盘教练,复旦大学客座讲师。 导言 很
DevOps时代
2018/04/08
1.5K0
持续反馈如何反作用于持续交付和持续集成?
《持续交付:发布可靠软件的系统方法》第5章 部署流水线
第5章 部署流水线 5.1 引言 持续集成的主要关注对象是开发团队。持续集成系统的输出通常作为手工测试流程和后续发布流程的输入。在软件的发布过程中,很多浪费来自于测试和运维环节。我们常常看到: 构建和运维团队的人员一直在等待说明文档或缺陷修 测试人员等待“好的”版本构建出来 在新功能开发完成几周之后,开发团队才能收到缺陷报告 开发快完成时,才发现当前的软件架构无法满足该系统的一些非功能需求。 解决方案就是采取一种更完整的端到端的方法来交付软件。我们已经解决了配置管理以及自动化大量构建、部署、测试和发布流程的
yeedomliu
2019/09/28
1.2K0
赵成:蘑菇街 DevOps 实践和转型之路
本文整理自2018GOPS·深圳站演讲:《蘑菇街 DevOps 实践和转型之路》 作者介绍: 我的题目是《蘑菇街 DevOps 实践和转型之路》。2015年前,在华为公司,2015年后到了蘑菇街。我在华为接触的更多的是电信级业务,软件开发和运维模式,也是电信级管理模式。到了蘑菇街后,到现在3年多,全部专注在互联网运维领域,我今天的分享的内容航,也是这3年来我们团队实践的内容。旁边是我的个人公众号二维码,主要分享一些运维时间和工作感受,大家感兴趣的可以扫一下。 ---- 今天分享的内容有三个方面: 第一,蘑
DevOps时代
2018/06/22
1.1K0
持续部署Microservices的实践和准则
当我们讨论Microservices架构时,我们通常会和Monolithic架构(单体架构 )进行比较。 在Monolithic架构中,一个简单的应用会随着功能的增加、时间的推移变得越来越庞大。当Mo
ThoughtWorks
2018/04/13
1.5K0
持续部署Microservices的实践和准则
详解~前端人需要了解的DevOps
DevOps 日渐成为研发人员耳熟能详的一个组合词,但什么是 DevOps,为什么 DevOps 对于互联网企业如此重要,真正将其思考透彻的人却不多,带着这些困惑,本文将带你一探 DevOps 的起源、原则和实践,让你搞清楚到底何为 DevOps。
zz_jesse
2021/07/30
6150
谈谈企业的持续交付流水线设计
有一天,业务人员急冲冲的跑过来,对你说生产上出现了一个严重BUG,必须要尽快修复。你听完问题描述后,胸有成竹坐定并迅速定位问题,随后改动了一行代码并提交,系统开始自动编译、各个环境自动化测试、发布上线。几分钟后,生产环境上该BUG已经被修复掉。 上面所提到的场景,这是不是很美妙?但是想必不少读者要忍不住要吐槽了,这太不实际了:新功能上线测试不要时间么?新增了功能肯定要做回归测试,这都需要一定的时间。况且怎么可以随便部署上线?还得通过预发演练、走发布审批流程。其实这些过程大家也都清楚,那么不妨从另一个角度思考
yuanyi928
2018/03/30
1.6K0
谈谈企业的持续交付流水线设计
持续(集成-->交付-->部署)
由上图可知「持续集成(Continuous Integration)」、「持续交付(Continuous Delivery)」和「持续部署(Continuous Deployment)」这三个概念的区别是在软件开发流程中根据实现的持续化,自动化的阶段的不同来划分的。
翎野君
2023/05/12
7520
持续(集成-->交付-->部署)
CI/CD这点事
持续交付指的是在短周期内完成软件产品,以保证软件保持在随时可以发布的状态。让每一个变更都经过一条自动化的检验流水线,来检查每一个变更的质量,通过就进入下一个阶段。其不是一种工具,而是一种实践!
用户5927304
2021/09/14
5770
CI/CD这点事
软件开发实践之持续集成
持续集成是一种软件开发实践,团队成员频繁将他们的工作成果集成在一起(通常每人每天至少提交一次,这样每天就会有多次集成);每次提交后,自动触发运行一次包含自动化验证集的构建任务,以便能尽早发现集成问题。
新亮
2022/12/05
6580
腾讯 TAPD DevOps 开放生态最佳实践
大家上午好,我是来自腾讯TEG的周仕林,今天主要跟大家分享的主题是腾讯TAPD DevOps开放生态最佳实践。我将从三方面做分享:
TAPD敏捷研发
2020/12/07
2.1K1
腾讯 TAPD DevOps 开放生态最佳实践
相关推荐
DevOps研效:TestX 持续测试中开发实践赋能
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档