一、前言
随着软件开发的不断发展,DevOps已经成为了一种流行的软件开发实践方式。在DevOps实践中,制品管理是一个重要的组成部分,它可以帮助团队快速交付高质量、高可靠性的软件,本文将介绍vivo制品管理在CICD的演进过程与落地实践,希望能为读者提供一些实践经验和思路。
名称解释
制品:在广义上指软件开发过程中生成的各种产物,包括软件代码、文档、报告、测试结果等,在狭义上,指软件开发过程中生成的最终产物,如编译产物、打包产物、镜像等。
制品库:制品库即管理制品的中央仓库,用来存储和管理不同格式的软件制品,如源代码,编译后的程序,镜像,配置文件,第三方库和依赖,版本信息等。制品库一般包含存储,版本管理,权限控制,安全扫描,依赖分析等功能,是一种企业处理软件开发过程中产生的所有包类型的标准化方式。
二、vivo CICD制品管理演进
随着DevOps行业的蓬勃发展,行业内越来越关注制品能力的建设;在不断的实践摸索中,vivo CICD制品管理能力也越来越完善,vivo CICD的制品管理发展一共经历了4个阶段,包括手工管理阶段、脚本管理阶段、平台管理 1.0 阶段和平台管理 2.0 阶段。
- 手工管理阶段:本地构建制品,手动上传到部署机器,进行手动部署。纯手工时代,需要耗费大量人力和时间,出错率高,无法保证一致性和可重复性。
- 脚本管理阶段:使用脚本化管理工具自动化构建、部署过程。通过Jenkins构建制品,上传到文件存储器,shell脚本从文件存储器(FTP)下载后进行部署。这一阶段初步实现构建、部署过程的自动化,并且保证了一致性和可重复性,但需要手动编写脚本,维护成本较高。
- 平台管理1.0阶段:基于Jenkins ,Spinnaker自研CICD平台,加速软件的构建、测试、部署和发布过程 。在这个阶段流水线比较完善,实现构建、测试、部署过程自动化,并且可以自动化地触发测试和部署操作,从而提高软件交付的速度和质量;但是制品管理能力有限,仅在流水线范围内保证一致性和可重复性。
- 平台管理2.0阶段:随着平台能力全面发展,为了提高研发效率和软件质量,降低运维成本,我们进一步完善了制品管理能力,实现制品的版本控制、存储、晋级和安全管理等,从而提高软件开发效率、简化软件交付流程、提高软件交付质量和可靠性。
当前CICD 制品管理处在平台管理2.0阶段,这一阶段制品管理具有如下优势:
- 多类型制品支持:制品库支持一个项目同时存在Generic、Maven、NPM、PyPI、Docker、Helm等多种常见类型,满足多技术栈研发团队的诉求。
- 制品统一管理:将软件研发过程中所有制品进行版本管理、集成、协同和发布管理等,从而提高研发效率和质量,支持持续交付和DevOps实践,提升企业竞争力和创新能力。
- 制品溯源追踪:基于制品元数据和准入准出规则,进行制品晋级,以制品维度记录从需求到发布的过程数据,实现需求、编码、构建、测试、质量和部署全生命周期过程的强管控,实现可信追溯与安全审计。
- 制品安全扫描:检测制品中的潜在安全漏洞和风险,提高系统和应用程序的安全性和可靠性,避免信息泄露和恶意攻击,从而保护企业数字资产的安全。
- 降低运维成本:统一管理制品,减少重复建设,降低运维、研发,测试沟通成本。
- 制品极速分发:支持多地数据中心上传下载,实现多地数据中心集群部署。
制品管理是软件开发和交付过程中不可或缺的环节,通过制品管理,可以提高软件交付效率、质量和可靠性,降低成本和风险,促进团队协作和沟通,提高管理效率和决策能力,从而提高企业的生产力和竞争力。
三、vivo CICD制品管理介绍
3.1 vivo CICD 制品管理概况
1)目前制品库支持:
- 元数据管理:对制品的属性信息进行有效管理和保护,包括编译产生的元数据,用户自定义的元数据,cicd平台生成的元数据等。
- 制品统一管理:统一管理制品生命周期,提供存储,溯源追踪,上传下载,版本管理,权限控制,回收,部署等多项功能。
- 制品晋级:不同环境中的配置和参数可能会有所不同,对制品进行适当的修改和定制化,以满足不同环境的需求,也是针对不同需求设置制品准入门禁。
- 极速分发:灵活地适应不同的部署需求和架构模式,将制品快速、可靠地分发到各地数据中心。
- 安全扫描:对制品进行全方位的漏洞,合规扫描(包含源代码,依赖,文件,镜像等),识别制品安全等级,提前规避问题。
2)制品生命周期
3)制品在研发流程中所起的作用
对于CICD流水线而言,制品起到一个承上启下的关键作用,它是持续集成CI的终点,也是持续交付CD的起点,是研发流程关键组成部分。
3.2 制品管理系统架构
3.3 核心功能介绍
3.3.1 制品统一管理
制品统一管理,顾名思义在软件研发和部署过程中,对产生的各种制品进行整体的统一管理。主要包含元数据管理,统一存储,制品生成,制品晋级,制品部署,制品扫描,制品老化,权限管控几大功能的管理。
(1)元数据管理
制品元数据是指对制品本身的描述和补充信息,与制品密切相关,是制品管理的一个重要部分。
目前管理的元数据有:
制品名称(MD5/镜像标签)、版本、类型、制品大小、来源信息、源代码、可部署环境、存储地址、扫描报告、依赖信息、制品作者、描述、老化日期,老化状态等。
通过制品元数据对制品有了全方位了解,可以帮助研发,测试,运维等角色快速定位识别制品、进行版本回溯,追踪问题的引入,及时修复安全漏洞等。
(2)统一存储
按照使用场景,制品一般分为三类,统一管理存储在对应的存储器上。
(3)制品生成
平台制品的来源分为三类类:手动上传制品,流水线构建、公网引入
(4)制品晋级
制品晋级流程
在整个研发流程中,研发团队一般都有开发,测试,预发,压测,生产环境,而对于不同环境可部署条件是不一样的,即不同的环境对于制品有不同的准入门禁,制品需要通过晋级来达到准入标准。
经过代码扫描,编译后制品生成 → 部署开发环境 → 经过安全扫描 → 部署测试环境 → 测试通过,并分发到线上仓库之后 → 部署预发环境 → 部署预发后,验收通过,并提交上线审批工单之后部署生产环境。
目前制品晋级规则比较简单,为了帮助研发团队有效且直观地区分制品版本的成熟度情况,提高交付效率和安全性,后续将支持自定义制品等级和晋级规则。
制品分发
在制品晋级的过程中,制品等级越高,越需要支持跨网络/数据中心使用,制品分发将生成的制品快速、准确和可靠地分发出去,供不同地区开发人员或用户使用,为企业提供更为高效和便捷的全球化业务支持。
(5)制品部署
制品部署是将软件制品部署到各个环境的过程,制品部署是软件开发的最后一步,也是最关键的一步,如果部署失败,将会导致业务中断或严重故障,保障部署制品版本正确至关重要。 平台目前有支持三种方式部署:构建部署一键运行,制品库选择制品,选择上线工单部署。
- 构建部署一键运行:用户选择代码版本进行构建,构建后制品直接部署到对应环境。
- 制品库选择制品:选择历史制品进行部署,为了保障用户选择到正确的制品版本,制品选择会展示元数据方便用户核对,且线上环境只能选已晋级制品进行部署。
- 选择上线工单部署:线上部署前需要提交上线工单,经过管理员、安全管理员,执行人等审批通过之后,选择工单部署对应制品至线上环境。
(6)制品扫描
制品包含的是在应用程序开发过程中产生的各种文件,从源代码到编译后的二进制文件、测试结果和部署配置文件,甚至到生产环境中使用的数据。一旦这些制品受到攻击或被窃取,会严重影响整个应用程序或系统的安全性和可靠性,安全扫描是制品管理中重要一环,有助于保障系统稳定性和安全性,平台对制品进行全方位的漏洞/合规扫描(包含源代码,依赖,文件,镜像等),提前识别制品安全等级,提前规避问题。这一部分将在3.2中重点介绍。
(7)制品老化
合理制定制品生命周期管理策略,定期清除无效制品,减少存储空间占用,可以提高系统性能,提供更安全、稳定、整洁的制品库。
- 自动化清理:制品生成后,平台会根据保留策略计算制品的销毁时间,然后根据制品销毁时间,自动定时清理过期制品。
- 保留策略:一般情况下,线下制品保留60天,线上制品保留90天,正在部署或者部署中制品不会被清理;支持定制化保留时间,对于迭代频繁或自动化程度高的项目,制品数量繁多,可以缩短制品保留时间,而像一些稳定的运维系统,可以延长保留时间。
- 清理白名单:对于一些特殊制品或项目,不能随意清理,可以申请清理白名单;白名单支持制品和项目两个维度;特殊制品可以申请清理白名单,延长保留时间或永不清理,项目也可以按项目维度申请白名单,为项目下所有制品申请清理白名单。
- 恢复策略:直接清理制品,具有一定的风险性,平台支持恢复老化制品;清理的制品,短期内平台会进行备份,已清理制品平台支持基于制品元数据(代码信息,编译环境等)重新生成制品,从而保障制品安全性。
- 标准化流程:为保证不清理掉与业务相关的重要信息或数据,对业务产生不利影响,必须按照规范的流程进行清理和记录,以下是整个清理流程:
(8)权限控制
制品权限控制是制品管理流程中非常重要的一部分,它可以确保制品在构建、存储、分发和部署等环节中,仅有经过授权的人员才能访问、修改、上传和下载制品。通过制品权限控制,大大降低公司潜在安全风险,防止机密信息和敏感数据的泄漏。
- 身份验证+角色控制:通过单点登录(SSO)确定用户身份信息,项目成员才能访问、修改、上传和下载制品;同时为了保障生产环境的稳定性和安全性,经过管理员审批的制品才能部署到线上环境。
- 项目隔离:为了确保项目之间资源不会互相干扰,保证项目制品的安全性,项目间的制品是隔离的,项目内的制品只能在项目中使用。
- 制品权限控制:针对制品进行单独的权限分配(设置制品可操作空间、可操作用户/用户组)。
3.3.2 制品安全扫描
(1)制品存在哪些安全风险
- 制品/依赖组件存在安全漏洞:未经过扫描的制品,制品或者制品中的依赖组件存在一些安全漏洞,黑客可以利用这些漏洞入侵系统。
- 制品中可能存在恶意代码:未经过扫描的制品, 可能存在恶意代码,部署这类制品会使整个系统处于风险之中。
- 制品中可能存在滥用SQL:滥用SQL带来SQL注入风险,敏感数据泄露,逻辑漏洞等风险。
- 制品中敏感文件存在泄露风险:制品中存在一些敏感/机密数据,若没有进行适当的加密或访问控制等措施,将使这些机密信息被黑客窃取或篡改。
制品安全扫描是提前发现和规避这些风险的有效措施,通过制品安全扫描保障应用程序安全,减少安全风险造成的损失,保护公司机密数据。
(2)全方位安全扫描
平台对制品进行全方位安全扫描,从源码→构建→制品→部署全流程进行扫描和管控,保障系统的安全性。
以上各种扫描(源码扫描,构建扫描,制品扫描)都会形成扫描报告,扫描结果也会记入制品元数据,作为制品的安全属性和制品晋级准入条件,进行部署管控,用户也可以在制品库查看制品的安全性与扫描报告。部署不安全制品时,线上线下环境会采取不同措施进行干预:
- 线下环境部署不安全制品,提示安全风险,进行处理指导,跟踪处理进展。
- 线上环境部署不安全制品,一般情况下,平台会自动检测制品安全性,不允许不安全制品上传;如果特殊情况必须上线,必须提前分析上线风险以及问题处理措施,经过安全团队审批,才能上线。
(3)组件准入规则
组件准入规则能够提前规避问题,保障整个应用程序或系统的安全性和可靠性,是软件开发和部署过程中必不可少的一环。组件准入分为二方依赖和三方依赖的准入,下图详细展示了组件准入规则。
图中名词解释:
- 内网中央仓库:存储依赖仓库,包括二方依赖,三方依赖。
- 安全扫描:扫描依赖,判断依赖是否安全。
- 安全依赖知识库:从公共仓库拉取的三方依赖/内部上传的二方依赖经过安全扫描后,安全的二/三方依赖会进入安全依赖知识库。
- 漏洞知识库:从公共仓库拉取的三方依赖/内部上传的二方依赖都经过安全扫描后,不安全的二/三方依赖会进入漏洞知识库;同时平台会定时从公共漏洞库拉取漏洞信息。
1)依赖包的拉取:本地编译或平台构建需要拉取某个依赖包时,平台依据安全依赖/漏洞知识库判断依赖是否安全,安全的依赖才允许下载;若某个依赖在安全依赖/漏洞知识库中不存在,会从公共仓库拉取进行安全扫描,确定是安全的依赖后才允许下载。
2)二方依赖推送内网中央仓库:本地二方依赖禁止推送,只能通过平台构建生成二方依赖;二方依赖经过安全扫描确定为安全依赖后进入安全依赖知识库并推送到内网中央仓库,不安全依赖记录到漏洞知识库。
(4)依赖正反向溯源
上图展示的是制品对应的简易依赖树,以及每个树节点存储的信息。
通过制品正反向溯源,确定组件历史版本和演变过程,追踪代码质量、安全性、改变历程等信息,帮助开发人员和系统管理员进行版本控制和漏洞检查,确保组件库中的所有组件都是计划中要使用的版本。
四、总结与展望
制品管理是软件开发和交付过程中不可或缺的环节,vivo CICD的制品管理经过四版的演进,从多品类支持,制品生成、制品晋级、制品部署、制品扫描,制品老化,制品管控等方面完善了制品管理能力,提高了软件研发效率、软件交付质量和可靠性、简化了软件交付流程、降低了运维成本。
目前vivo CICD的制品管理是一个相对完善的制品管理平台,但制品管理作为软件开发和部署过程中重要的组成部分,在未来会走向更加智能化、集成化、安全化和规范化的方向,在制品管理的道路上我们还需不断实践探索:
- 智能化方面:随着人工智能的发展,人工智能技术越来越成熟,后续将借助机器学习等技术,智能识别制品安全情况,提供智能分析,智能推荐等功能。
- 集成化方面:制品库与DevOps、CICD关系将会越来越紧密,后续将在制品管理中集成CICD能力,例如用户可以在查看某个制品的同时进行一键部署。
- 安全化方面:随着软件和网络安全威胁的不断增加,制品库安全扫描的重要性将会日益凸显。为增加安全性能和提高交付效率,进行安全左移,例如将扫描前置到开发过程中。
- 规划化方面:引入更多的规范化策略和标准,研究制定更加严谨的制品管理流程,防止因为制品管理的缺失导致安全问题,提高交付效率。
制品管理还需要结合实际场景进行探索和创新,寻求更加智能化、灵活化和安全的实现方式,推动整个软件开发生态的不断发展和进步。