48

构建企业级软件供应链

 5 years ago
source link: http://dockone.io/article/5995?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

软件"吞噬"世界正在成为现实,未来的任何一家公司都是软件公司。软件研发正在从传统的"手工作坊"模式转向"流水线"模式。软件生产力的提升将会越来越依赖自动化、标准化及规模化的作业流水线,正如从手工到工厂的工业革命一样,软件的研发、测试和交付等环节也会随着DevOps的不断深入而发生革命性的变化,软件在供应链"管道"中被流水线进行加工,最终呈现在用户面前。

什么是软件供应链

软件供应链可以理解为一套自动化、标准化的持续交付作业流水线,其特点基于数据的决策流程(Data Driven Process),几乎不需要人为的干预。软件供应链可以类比于工厂的自动化生产流水线,每一个环节由特定的角色负责完成特定的任务,共同达成按时保质保量交付产品的目标。

为什么我们需要它

在软件交付领域有三个个公认的规则:

人是不可靠的

在大量的重复性任务面前,尤其是超负荷工作的时候,人犯错的概率会处于一个比较高的状态。软件交付是一个"精密"程度要求非常高的协作过程,细小的疏漏可能引发"蝴蝶效应"。随着软件交付规模扩大,参与的人员越多,每一个细节被忽略的概率就越大,潜在的风险也就变得不可预测,更谈不上可控。

测试是确保可靠性唯一的手段

这句话的原文是:No Test No Trust。软件交付件与传统商品最大的区别在于,无法通过视觉、触觉和味觉去直观地评估其优劣。实践是检验真理的唯一手段,所以,测试成为了论证其可靠性的唯一之道。只有经过测试的交付物才被认为是可信的,这是基本原则。

度量是改进的前提

这句话原文是:No Measure No Optimization。软件交付过程中所涉及的内容非常广泛,策略、流程、工具等等在各个项目中都不尽相同,即使通一个项目,在不同的成熟度阶段也可能采用不同的流程和规范。如何评估目前的流程是否需要优化,优化的具体点在哪里,具体的优化方向又是怎样的,这些决策都需要各种层面的度量数据来作为支撑。

它是如何工作的

最早期的开发者都是纯手工维护依赖,不同的人有不同的维护方式,在后期二次开发和维护阶段,新人需要较长的时间去了解这些跟业务不相关的内容,然而这些技能基本不可复用。后来大家意识到这个问题,采用了一些自动管理依赖的工具,比如Maven等。一个简单的命令就可以获取依赖,构建,并且支持在构建过程中运行静态扫描和单元测试等等。

在一些点上做到了自动化,大家看到了优势,期望把这些点串起来,形成一条作业流水线。将之前通过人不断重复的任务交给机器去完成,这样就完成了一个最基础的作业流水线。有了这样的基础,软件的持续集成和交付才可以在此基础上优化和迭代,不断将最佳实践引入其中。

无论企业规模的大小如何,软件交付都在努力追求三个目标:提升效率、降低成本和控制风险。自动化的流程无疑是提升效率的有效手段,但往往需要在"快"和"好"之间做一些权衡取舍,比如引入一些安全扫描、灰度发布,甚至是人工审核的步骤。整个管道通畅之后,每一个细节都需要收集相关数据,以便进行监控和分析。此时数据的价值就体现出来了,通过上线速度趋势、质量变化趋势和成熟度趋势等等一系列视图,"瓶颈"就可以清晰地暴露出来,"对症下药"进行优化也就成了水到渠成的事情。

qEf6fqj.png!web

软件供应链的数据驱动特性

测试团队的职责通常是开发测试案例、执行测试,往往忽视了结果的有效分析和反馈,如最近的质量变化趋势,甚至引导开发团队进行优化。软件交付供应链更强调团队内部迭代,即快速反馈、快速响应和快速优化,而不仅仅只是为了去完成某个具体任务而已。

对于小团队来说,众人头脑风暴结合感性的认识,加之较容易跳出个人所在的角色从更高维度看问题,比较容易得出正确的结论。然而,对于大型的跨多个地域,甚至跨国的团队来说,每一个调整都需要大量的数据收集、分析论证、实验性实施和最终落地工作,其沟通协调成本、时间成本都非常高。

在供应链中流通的内容(通常是交付物)在经过每个阶段,比如需求、开发、集成、测试、部署和升级/回退各个阶段,都会被记录上相应的元数据信息,如代码提交者,提交分析,构建环境,测试类型及结果,部署工具及环境等等。于此同时流程相关的细节信息都会被集中收集。在数据的基础上,就可以实时动态地评估各种维度的参数,比如交付质量情况、团队开发能力和下一步的优化策略等等。

传统交付都是以人为中心,以人的决策来驱动流程,数据往往只是辅助,而在供应链中,每个阶段的关键数据的采集、管理、分析都由机器负责完成,人把决策能力交给机器,而只负责定义标准或规则即可。让数据和规则进行匹配,决策在供应链中交付物是否应该进入下一个阶段。

Z7RvAni.png!web

如何构建

1.全语言及工具链支持

在微服务的时代,每个微服务开发者可以独立选择各自的开发语言,构建工具等等,软件供应链必须拥有良好的生态去支持各种开发语言和CI&CD工具链。

6JrABfq.png!web

2.基于数据和规范驱动的流程

每个企业的软件交付规模不同,其软件供应链复杂度也不同。从小团队的一个Jenkins Pipeline,到全球多地域的协同分发巨型网络拓扑。麻雀虽小,五脏俱全,小团队也需要相同的策略、流程和规范去定义发布。

mINBzmQ.png!web

每一个团队的交付都遵循最佳实践,才可以通过一把"标准尺"衡量各个团队的能力,从而发现可改进的点。不同的开发语言团队,采用相同的策略。

NjQbMfm.png!web

3.高可用、高并发及容灾

企业级软件供应链会是一个实时在线的系统,保证任何时间的更新都会被快速发布,所以必须具备高可用能力,同时也需要抗大流量冲击的能力,于此同时还需要支持多可用区的热备。

高可用对于供应链来说,不仅仅意味着保障软件交付流程的高可用,在进入容器交付时代,容器云中的应用会动态扩容、迁移以及升级/回退(引入灰度系统),所以高可用的二进制仓库也是应用高可用的必要条件。

FJvime6.png!web

4.企业级安全

安全从来都是一个重要的话题,在持续交付领域,交付物的安全包含多个方面,总结下来,主要包含以下几个方面:

  • 认证及权限
    支持多种认证中心对接,如LDAP,OAuth等等,角色权限粒度支持仓库、目录及单文件的CRUD操作。
  • 安全扫描
    任何进入软件供应链的二进制内容都必须经过安全扫描且符合安全管理规范,在流程开始前就解决安全问题,从而降低安全维护的成本,这也是Fail Fast思想的具体体现。
  • 影响力分析
    任何底层依赖的变化必须触发扫描,并且依据依赖关系提供企业内部影响范围视图,方便快速定位受影响项目和组件,及时控制风险或止损。

R7ZzEzz.png!web

5.全球复制分发能力

随着公有云基础设施的不断完善,应用很可能会在全球多地域范围部署。软件供应链必须提供全球分发的能力,以满足应用快速更新并及时被终端用户使用的需求。随着互联网的普及,很多全球性企业都需要这种更广维度的复制分发,充分运行云基础设施的能力,打通整个从创意(idea)到价值(value)的链路。

ruIJfyq.png!web

方案选型

JFrog Artifactory 作为统一的二进制软件包管理、DevOps全生命周期数据管理以及支持跨地域复制分发的平台,被全球500强93%的企业所采用,这些公司包括Google、Apple、AWS以及国内的华为、腾讯、京东等等一系列行业顶级客户。作为组成软件供应链的基础设施,正在被越来越多的企业所采用。

Artifactory提供的全开发语言的二进制集中管理和全生命周期的元数据管理机制,能够结合元数据和质量关卡,打通自动化交付流程。Artifactory实例自持多节点的多活模式部署,因此自持全语言私服的高可用。与此同时,JFrog Xray可实现二进制级别安全扫描,可对接多种漏洞数据源,并且在企业内部形成漏洞影响力分析图谱,帮助安全负责人快速控制风险影响范围。

全语言的集中管控和一致性、规范性的流程,有助于基于DevOps数据做深度数据挖掘,如需求上线分析、质量态势监控及研发能效分析等等,这些都为流程监控和度量提供了数据基础,也为发现问题和瓶颈及优化决策提供了有力的数据支撑。

aiYRny2.png!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK