
发布
研发团队发布一个版本,代表着开发完成并且测试完成是一个可以销售的软件,也代表着这个软件的上市
将软件售卖之前,需要把版本复制到软盘、U盘或者刻录到光盘上,通常叫做发布到工厂(RTM,Release to manufacturing)
软件正式上市售卖代表着软件已经Gone Live,上线
部署
如果是面向个人的桌面系统软件,那么由个人担当部署的人员,将软件(来源于软盘、光盘、U盘)进行安装,安装后自行进行配置
如果是面向企业的软件,那么由甲方的IT工程师负责安装和配置,或者是由乙方的服务人员负责安装和配置
还有另外一种情况,在甲方真正安装和配置软件之前,有一个用户验收测试(UAT,User Acceptance Test),在甲方的机房,先安装和配置一套,然后由甲方进行测试,如果测试通过,代表验收成功,就可以正式的去安装和配置
发布
用户能看见软件或者直接使用软件,概念上和互联网之前的年代是一样的,目的都是上市
通常是将一个版本发布到网上(RTW,Release to the web)或者叫做网上发布(Web release)
在中国互联网行业,通常称之为上线(Release to production)
部署
部署变成了将软件包发布到生产环境的一个动作,或者是一个步骤
即通过部署的动作,达成了发布的结果
持续部署
持续的,自动化的,将软件包发布到生产环境
SaaS和网站类型的,就是直接部署到网站上
移动应用App类型的会通过各种APP分发渠道,发到应用市场,例如苹果的AppStore,安卓的各种应用市场
按需发布
根据业务需要,发布功能
发布,代表用户看见软件或者可以直接使用软件的功能,即release the functionality to end users
补充说明
对于一些ToB的企业级软件,例如电信行业,通常是软件+硬件整体销售给运营商(例如中国移动),仍然会涉及到发送硬件(例如交换件、路由器)到运营商,然后设备商(例如华为)的服务人员在客户现场进行机房、硬件等的安装和配置,之后才会割接上线
而2011年建立的开放网络基金会开始在业界大力提倡软件定义网络(SDN,Software-defined networking)和OpenFlow协议,在一定程度上解耦了软件和硬件,那么DevOps的理念就有可能被达成,例如在华为生产的软件通过网络直接在中国移动的网络上升级软件

部署
是指在特定的环境中安装指定版本的软件(例如,将代码部署到集成测试环境中,或者部署到生产环境中)。
具体的说,部署可能与某个特性的发布无关
如果部署与某个特性发布有关,部署后即时生效,即代表着发布,部署=发布
发布
是指把一个特性(或者一组特性)提供给所有客户或者一部分客户(例如,向5%的客户群开放特性)。
代码和环境架构要能够满足这种要求:特性发布不需要变更应用的代码。











企业并没有广而告之声明有新版本发布,用户不知道软件已经升级,并且只有发布给选定的小部分用户,他们才能感知到新功能
用户不知道被选定在测试新功能,例如用户界面没有变化,仅仅是后端算法逻辑等发生变化
黑启动的另外一种做法,就是选定的部分用户实际上是公司内部员工,这样内部员工可以先吃自己的狗粮,对新功能进行测试,而真实用户并未真正使用新功能
要黑启动这个功能,先发布给1%用户给他们启动这个功能,然后再分别发布给5%,30%用户
在这个过程中评估结果。如果结果是增加了成交额,就可以逐渐增加推出的百分比,否则可以简单地回滚该功能,以便进一步评估和优化这个功能
在将所有流量切换到新的系统架构之前,可以通过专门用于配置管理的开关/标志(toggle/flag)切换路由流量,以黑启动新的基础架构。例如,假设要停止维护自己的队列系统并切换到托管服务。可能会创建一个标志,将一些作业发送到新的托管服务,同时仍将大多数作业发送到旧的队列系统(并且设置了守护程序来监听这两个作业)。然后,可以在监视性能和其他指标时逐渐过渡到全托管服务。
这个发布策略和笔者2009年在敏捷中国大会参加会前Kent Beck的响应式设计培训是一致的,Kent Beck提到响应式软件设计的四个策略:飞跃Leap,并行Parallel,踏脚石Stepping stone,简化Simplification。针对风险比较大的重构或者新的基础设施,可以采用新老两套架构并行的方式,逐步迁移,并且两个架构同时向前发展,直到最终新架构代替老架构。

新功能对原有用户与系统的交互逻辑进行了修改
通过ID(例如邮件或者用户名等)来圈出特定的要进行测试的β用户群,黑启动新功能给这些特定人群,企业随时可以添加或者删除β用户。
这种场景,被选定的用户群是可以感知新的功能的,这也被称作金丝雀发布,金丝雀发布时黑启动的一种类型
在全面发布给所有用户之前,黑启动允许向VIP用户推出新功能
可以允许用户自己选择加入或者退出黑启动功能

第一批金丝雀用户:先将新版本部署部分机器或者服务实例,并对部分选定用户开放
第二批所有用户:之后再将所有其他机器或者服务实例进行部署,并对所有用户开放
A1组:仅向内部员工提供服务的生产环境服务器。
A2 组:仅向一小部分客户提供服务的生产环境服务器,在软件达到某些验收标准后部署(自动化部署或手动部署均可)。
A3 组:其余的生产环境服务器,软件在A2 组中达到某些验收标准后再部署。

暂存用于部署的工件,包括:构建工件,测试脚本,配置文件和部署清单。
从负载均衡(Load Balancer)中删除“ 金丝雀”服务器。
在“ 金丝雀”服务器上升级新版本应用程序。
自动化测试应用程序。
恢复“ 金丝雀”服务器连接到负载均衡(连接性和完整性检查)。
如果用户实时使用情况下的“ 金丝雀”测试成功,则升级其余服务器。(否则回滚)


实验目标:为同一个目标(例如优化转化率或改进某些业务指标等)
实验变量:针对单一变量(例如页面的按钮颜色发生了变化)
实验方案:制定两个版本(即A和B两个变体),在总体用户中取出一小部分,将这部分用户完全随机地分在两个组中,使两组用户在统计角度无差别,将两个版本分别展示给不同的用户组
试验分析:有可能版本A是老版本称之为对照组,B是新版本称之为实验组,收集对照组和实验组组对应的用户体验数据和业务数据,最后分析、评估出最好版本,正式采用。


ToC的例子,所有的用户使用同样的单体软件部署到PC上之后,根据用户的购买的License,打开和关闭某些特性
ToB的例子,电信行业,例如华为和中兴卖给中国移动的设备,在部署到客户网路之中后,不用升级软件,只要购买了新的License,相应的特性就会被打开





在你想改变的那部分代码之上创建一个抽象层。
对其余部分的代码进行重构,使其使用这个抽象层使用其之下的代码提供的功能。
在新的实现代码里实现一些新的类,让其上的抽象层根据需要,选择性的导向旧代码或新增的类上。
剔除原有的旧实现。
清理,并重复前两步,如果需要,可同时交付你的软件。
一旦旧实现完全被代替后,如果你愿意,可以移除那个抽象层。





预推送测试(Pre-Push Testing):每个开发人员从主干Master上拉一个本地分支,在本地分支开发,在本地经过单元测试,静态代码扫描,以及部分集成测试之后,进行代码评审
推送中(On push):代码评审之后就启动合并到Master的推送请求,代码在真正的push到master分支之前,触发了自动化测试,包括:单元测试,黄金流程(被大量使用的功能以及核心流程)的冒烟测试,以及简单的新功能测试确保新构建没有问题(build test);所有的自动化测试通过后,本地分支代码就被允许自动合并到master分支,如果出现合并冲突,相关的开发人员就解决冲突
在主干和发布分支上持续测试:每隔几个小时,并行的在主干和发布分支上,持续的运行所有的自动化测试,包括:全面的的build test, 回归测试以及性能测试等







软件发布生命周期:https://en.wikipedia.org/wiki/Software_release_life_cycle
持续部署:https://www.scaledagileframework.com/continuous-deployment/
按需发布:https://www.scaledagileframework.com/release-on-demand
亚马逊平均每11.6秒部署一次:https://www.youtube.com/watch?v=dxk8b9rSKOo
《凤凰项目:一个IT运维的传奇故事》:https://item.jd.com/12708994.html
《持续交付:发布可靠软件的系统方法》:https://item.jd.com/10843669.html
《持续交付2.0:业务引领的DevOps精要》:https://item.jd.com/12512514.html
《发布!设计与部署稳定的分布式系统 第2版》:https://item.jd.com/12627801.html
Facebook大规模快速发布:https://engineering.fb.com/2017/08/31/web/rapid-release-at-massive-scale/,https://www.jianshu.com/p/ef4e9aeac507
Facebook如何实现大规模快速发布:https://www.infoq.com/news/2017/09/facebook-release-scale/,https://www.zybuluo.com/sambodhi/note/893487
Facebook的移动端软件的持续部署:https://research.fb.com/wp-content/uploads/2017/01/paper_fse2016-003.pdf
Facebook移动发布流程:https://www.infoq.com/presentations/Facebook-Release-Process/
Facebook 的 DevOps 案例研究与相关工具:https://segmentfault.com/a/1190000019236151
应用部署和测试战略:https://cloud.google.com/solutions/application-deployment-and-testing-strategies
应用部署的六个战略:https://thenewstack.io/deployment-strategies/
什么是蓝绿部署:https://digitalvarys.com/what-is-blue-green-deployment/
为什么领先公司使用黑启动:https://launchdarkly.com/blog/why-leading-companies-dark-launch/
Facebook Chat:https://www.facebook.com/note.php?note_id=14218138919
Facebok黑启动:https://controlaltconstruct.blogspot.com/2019/01/facebook-dark-launching-technique.html
黑启动:https://martinfowler.com/bliki/DarkLaunching.html
Kent Beck响应式设计:https://www.infoq.com/presentations/responsive-design/
动物哨兵:https://en.wikipedia.org/wiki/Sentinel_species
国内金丝雀:https://en.wikipedia.org/wiki/Domestic_canary
金丝雀发布:https://martinfowler.com/bliki/CanaryRelease.html
金丝雀测试:https://featureflags.io/canary-testing/
蓝绿部署,A/B测试和金丝雀发布:https://blog.christianposta.com/deploy/blue-green-deployments-a-b-testing-and-canary-releases/
A/B测试:https://en.wikipedia.org/wiki/A/B_testing
A/B测试知识点总结:https://www.jianshu.com/p/c5832ad60575
A/B测试实践全总结:http://www.woshipm.com/pmd/699804.html
A/B测试:https://learn.growthhackers.com.cn/skills/ab/
多变量测试与A/B测试:https://www.optimizely.com/optimization-glossary/multivariate-test-vs-ab-test/
特性开关:https://martinfowler.com/articles/feature-toggles.html
部署新版本:特性开关还是猪增量发布?:https://opensource.com/article/18/2/feature-flags-ring-deployment-model
特性开关驱动开发:https://blog.launchdarkly.com/feature-flag-driven-development/
探索如何在生产环境逐步地为部分或者全部用户启用特性:https://docs.microsoft.com/en-us/azure/devops/migrate/phase-features-with-feature-flags?view=azure-devops
特性开关使用场景:https://featureflags.io/feature-flag-uses/
利用抽象分支做增量式大规模软件改造:http://www.continuousdelivery.info/index.php/2013/01/04/branch_by_abstraction/
老马的抽象分支:https://martinfowler.com/bliki/BranchByAbstraction.html
Facebook主干开发:https://paulhammant.com/2013/03/13/facebook-tbd-take-2/
我们经常聊的金丝雀发布、滚动发布、蓝绿发布到底有什么差别?https://mp.weixin.qq.com/s/MS8wi5t7btxO18Q0rfat4g







云妹导读:
