摘要:持续交付的最终目的是高效和可信两者的结合。
持续交付是一个大家平时提得比较多的话题,高效是持续交付的目的,具体到华为云的场景下,持续交付的最终目的是高效和可信两者的结合。
总体而言,软件研发的目的是持续并且快速地交付高质量的有价值的软件给客户。首先研发是一个快速且持续交付的过程;其次研发是面向客户的,交付的软件必须是对客户而言高质量且有价值的,而质量是多方位多维度的,其衡量标准除了价值以外,还包括稳定性、安全性、可靠性、可扩展性等。
从软件生命周期管理的全过程来看,产品的idea产生后,进入开发,然后到部署发布,最后到运维,这是一个端到端的完整的流程,每个环节缺一不可。
往深一层:
回到业务侧,将上述从产品到研发的流程映射到整个产品生命周期。
增值的部分,我们追求的是最终的效果;非增值的部分,我们追求的是效率,即我要高效地完成这个过程,以便于达到最后的结果。
要通过过程来保证效果,因此过程也是必不可少的。但在这些过程中有很多工作是重复的,比如测试、部署,我们需要通过自动化的方式去赋能。这就是我们通常讲的DevOps的意义,通过自动化的流程和工具,让机器去完成重复性的工作。
观全貌我们不难发现,在整个软件/产品生命周期,质量通过逐层的测试、验证、反馈等贯穿始终。另外,其中也包括大量安全类的活动,比如在产品创新阶段要考虑安全性的诉求;在开发过程通过黑盒、白盒、静态、动态等测试保证安全。
最后落到可信的层面,华为整个研发体系服务于整体的业务诉求,大家都知道,华为处于通信行业,通信是一个关乎国计民生的领域,对安全的要求非常高,提供的产品和服务必须可靠可信,因此我们做了很多可信工程的设计。
自上世纪四五十年代起,开始有了第一台大型计算机,软件工程也随之兴起并发展至今。华为成立于1987年,最开始是单兵作业或小团队作业的方式,后来随着业务的增长团队规模不断扩大,如何支撑大规模集团军作业?为解决这一问题,我们开始引入IPD,由此进入IPD1.0时代。随着互联网技术的发展,有了敏捷开发、CMMI、DevOps持续交付、云原生等方法论和实践,我们将这些优秀的方法论和实践合并到IPD1.0的框架中,使之更灵活地适应实际的软件研发需求。
2019年起,我们开始做IPD2.0,其中一个非常关键的点是可信。
我们先来给“可信”下个定义。
可信是每个系统在业务意图之外同时具有韧性、Security安全性、隐私性、Safety安全性、可靠性、可用性六个特征的确定性程度。
也就是说,每个系统在业务意图(即功能性诉求)之外,还需要同时具备6个特性:
华为的可信工程将这6个特性作为基本的诉求,再关联业务意图,高效地完成业务目标,带给客户价值的同时兼顾可信。
如果大家了解精益等实践,就知道研发实际上是一个价值流交付的过程。那么,可信价值流框架是什么样的呢?可信价值流框架是产品生命周期端到端的过程,以终为始,我们要的是结果安全、结果可信、过程可信,即我们通过过程的可信达到结果可信赖、可依赖、安全的目标。
将整个产品生命周期进行拆解:
再细化下来,又涉及到产品定义阶段、产品实现阶段、产品预发布阶段、产品使用阶段等,每个阶段都在传统软件工程的基础之上,加入具体的动作去满足整体可信的要求。比如,产品定义阶段,在规划和设计中考虑可信诉求;产品实现阶段,考虑编码是否安全、编译是否多次可用,交付给不同客户的软件包是否正确,测试是否可重复……在产品预发布和使用阶段也会有很多相应的策略实现可信。
技术层面,我们通过使用建模和仿真技术、密码学的加解密协议、操作系统可信等技术使能可信。
这是一条完整的通过过程可信达到结果可信的路径,最终我们通过各级度量进行持续改进。
华为云集合业界先进理念和华为30年研发经验,总结出一套可操作可落地的端到端一站式开发方法论和工具链——华为云HE2E DevOps框架。
华为云HE2E DevOps自2018年发布1.0版本,到今年发展为2.0版本。华为云HE2E DevOps框架v2.0整体分为6大阶段:规划与设计、开发与集成、测试与反馈、安全与审计、部署与发布、运维与监控。本文将着重介绍工程端的内容,包括开发与集成、测试与反馈、安全与审计、部署与发布。
云的服务本身就是生于云长于云的,因此我们一直在做CloudNative实践,在架构、工程交付、全功能团队、云环境四部分不断优化,持续提升质量。
从以上4个方面我们不难得出构建云原生的Cloud Native能力必不可少的铁三角:架构、组织、工程,我认为中间还应该加上价值交付。回到最初那句话:研发的目的是持续并且快速的交付高质量的有价值的软件给客户。
1)架构层面
2)工程层面
3)组织层面
总结起来是:大兵团作战,顶层设计,统一认识,组织赋能。角色上分为研发&运维团队、设计&开发&测试骨干、架构师,每个角色要做什么,通过培训和赋能的方式来进行定义和支撑。
我们有一套一站式的微服务管理平台来支撑微服务的12设计原则。
1)Clean Code机制
业界一致认为,编写Clean Code能有效减少漏洞,降低系统脆弱性,是实现软件可信的重要举措。我们内部也非常强调Clean Code(代码整洁),建立起一整套完整、具备快速反馈能力、可持续生成好代码的机制。
华为有自己的Clean Code定义和文化。通过Committer机制、门禁机制、代码极致共享等做相关过程的支撑,通过开发者测试对整体质量进行把控;并建立三层模型和六级标准,支撑实时代码评估、版本交付阶段性评估和产品长期演进的年度评估。
2)Clean Code评估
业界Clean Code评估标准是:高效、可移植、安全、简介、可靠、可测试。华为持续对业界最新标准进行有效的代码评估,并结合实践建立了三层质量模型和六级质量评分标准。
关键举措包括:建设分级标准,我们会对不同系统进行评级;开发可视化工具;建立定期评估指导场景;持续对标业界刷新评估模型。
Committer来源于开源社区,大家都知道开源社区的协作模式是分布在全球各地的开发者以协同贡献的方式进行开发,代码贡献者的能力、水平、责任心等参差不齐,因此必须在代码入库之前进行Committer评审以保证质量。华为内部也有开源的机制,借鉴这一实践,形成自己的Committer机制。
华为的Committer机制实际上是一套流程来保证整体的代码质量,包括三个角色:
底层通过IT基础设施来保证编译部署、测试等过程,通过自动化工具使能,减轻评审的重复劳动。
整个Committer流程由几个核心点:
华为云全场景测试服务框架提供一站式端到端测试自动化智能化解决方案,为企业构建测试中台,提升企业测试专业度及测试效能。整个测试框架分为三大块:测试设计、设计执行、测试分析,包括测试设计、测试用例管理、服务接口测试、WebUI测试、终端测试、性能测试、安全测试、导流测试、在线测试及测试分析报告等功能。底层有一套完整的测试管理平台来支撑。
全场景测试服务有3个要点:
全流程测试,每个阶段都有对应的测试动作:开发环节有验收测试、单元测试、功能测试、coding里的代码质量把控也是测试;测试环节有回归测试、集成测试、性能测试、安全合规类测试等;部署环节有A/B测试、在线上环境和生产环境做一些复杂测试,还包括吃自己的狗粮等。
整个测试会分三级进行,分别是个人级、服务级、产品级。每级的流水线都会涉及到质量活动,流水线也会分层分级:
在微服务交付过程中有不同的环境,比如Alpha环境、Beta环境、Gamma环境等,每个环节有相关的质量检查门禁和验收标准,以及现网的质量活动。这些质量活动由不同的角色来承担:
除了流程以外,我们还会有一些质量定义和度量标准。测试度量标准总体分为两类:过程指标和结果指标。过程度量包括:覆盖率、执行率、测试效率等;结果度量包括:功能测试、性能测试、安全测试、可靠性测试等。
安全和可信直接相关,说到可信,大家自然会联想到安全。权衡DevOps速度与现有安全要求的需求,催生了一个名为DevSecOps的模型。
什么是DevSecOps?DevSecOps基于“安全问题,人人有责”的原则,它强调应用程序开发人员可以怎样把安全检查与他们的集成和部署流水线构建到一起。简单来说,就是把安全层面的活动渗入到DevOps开发过程的各个环节中。 在华为云的实践中,我们更关注在软件开发过程中植入安全活动保证软件生产的可信可靠和稳定。
同样从软件生命周期来看,华为企业级安全工程实践基于DevOps流水线,在计划、编码与构建、验证、发布与运维运营等每个阶段都有相应的安全考核点和实践介入,底层会有标准和规范、技术和能力、工具和流程来支撑,全流程保障网络安全,实现安全设计、安全编码、安全测试、安全运维。
华为内部自研了一个工具:CodeCheck,以应对严苛的安全要求,保证整体代码质量和安全。我们分别从能力、效率和生态运营来看CodeCheck。
我们的安全规则来源于两个层面:
业界经常提及的静态分析安全测试(SAST)包括四层:编译、构建、语法分析、语义分析,安全检查涉及的技术栈明显更深,华为提供全栈能力、多语言支持,支持深入的语义分析能力。如果把质量和安全结合到一起,需要一些规则和引擎来支撑,还需要引入一些智能化的手段,自动检查、自动修复。
华为内部将规则集分为三层:公司级、产品线级、产品级/版本级/工程级。公司级规则集包括强制规则集,比如低误报,默认必须扫除,而检视规则集则可根据需要勾选;产品线级规则集和产品级规则集,产品线管理员配置为强制要求,其余的规则集可根据产品特性进行选择。
整个工具不仅仅是简单的安装+运行,而是一个MN矩阵式的运营体系。从规则定义上来讲,有公司级、产品线级、产品级等不同层级的规则;从时间周期上看,哪些规则放在开发者桌面IDE里、哪些规则要放在流水线里、哪些规则要放在版本构建里,都有一个设计的过程。
在安全层面,我们提供了企业级专家服务,其服务策略类似于医院看诊。普通“发烧感冒”的诊治,提供基础服务;针对“大病重症”,提供专业的自动化检查能力及工程配套能力;针对“疑难杂症”,提供顾问式专家服务。
持续交付的过程是和持续开发与集成、自动化测试等关联在一起的。比如分层快速闭环,在测试的时候就会分不同的层级去执行,分层的目的是为了快速反馈和闭环。
持续交付的核心实践除分层快速闭环外,还包括:小迭代高节奏交付、自动化&可视化流水线、自动化持续部署、缩短单点耗时、高效标准化环境等。
自动化部署的背后是标准化环境,需要代码的分支结构和整体的CI/CD流水线有很好的匹配和映射关系。
我们从代码主干上拉出来一个代码分支,在上面做相关的开发,提交后自动拉起来一个CI流水线,对代码进行静态检查和自动化构建,包括部署包准备、代码合并等,最终通过个人级别的流水线后,跑到生产环境上,整个过程都是和CI/CD流水线关联在一起的。
我们把可信的概念内建到整个流水线里,自动化检查、验证,过程中获取反馈,支持实现CI/CD过程的高效可信。
如果代码层面是可信的,到编译构建的时候,可以可重复地高效地构建出来;同时,测试活动中也会加入可信相关的检查点;到上线后,Chaos Monkey等实践也都是跟可信直接相关的,比如我们经常强调的弹性、稳定性等。
可能有人会问:怎么防范我的环境里被人植入漏洞?其实环境也好、过程也好,都可以代码化,代码化后就可以把它纳入到整个版本管控中,这样的话所有的修改和变更都可以自动化,也可以针对这些环境和过程进行安全审计。
我们称之为Everything as Code 一切皆代码。除了基础设施以外,编排、配置、测试、数据库、流水线、代码都可以这种方式呈现出来,这样就可以实现版本化、自动化和标准化。再往上到Service也如此,Service as Code实际上就是我们想要强调的API。
在发布的时候,我们会有各级发布的机制。首先我们会做一级的灰度发布,找一些重点MVP客户,或者内部使用者,发布给自用环境;没问题的话再进行二级灰度,这时会适度扩大范围,开放给全网10%左右的用户;然后再做三级灰度;最后才是全量发布。
在这个过程中,一旦任何一级出现问题,马上就可以进行修复和回滚。同时我们会做一些在线导流测试,结合AB测试进行业务层面的探索,我们一直强调通过技术的手段赋能业务。
以上介绍的是华为云的DevOps体系,其核心除了通常我们所说的“高效”、“持续交付”以外,更重要的一点是“可信”。我们将这一体系称为“云与安生时代的DevOps体系框架”。
顶层是商业决策,我们会持续规划、定期审视,固定节奏对其进行相应调整;往下是服务化组织、架构解耦,开发&运维落地;再往下是工具、环境支撑;最底下是服务流程支撑。
如何去构建这样一套体系?我们要始终围绕整体的研发效率目标,选择应用相关的研发工具,以工具承载新型能力,支撑高效作业、持续交付、高效协同、智能化辅助开发、持续反馈与改进,进而构建整个的持续交付能力。
——————————————————————————————————————
内容来源:【2020 CSDI SUMMIT中国软件研发管理行业技术峰会】分享实录,原文首发于“百林哲”。作者:姚冬
嘉宾简介:华为云应用平台部首席技术解决方案架构师,资深DevOps与精益/敏捷专家,华为云享专家,中国DevOps社区核心组织者,IDCF(国际DevOps教练联合会)发起人
点击关注,第一时间了解华为云新鲜技术~