阿里巴巴DevOps实践指南(十七)| 提升构建的效率

简介: 构建是将源码变成制品的过程。构建包括编译,但不等同于编译。即使对于不需要编译的解释型语言,也要构建成一个压缩包或 Docker 镜像再去部署。无论是在开发阶段还是 CICD 阶段,都离不开构建过程,构建的质量和效率对持续交付影响很大。影响构建效率的因素,包括源码以及构建的依赖。

image.png

编者按:本文源自阿里云云效团队出品的《阿里巴巴DevOps实践指南》,扫描上方二维码或前往:https://developer.aliyun.com/topic/devops,下载完整版电子书,了解阿里十年DevOps实践经验。

构建是将源码变成制品的过程。构建包括编译,但不等同于编译。即使对于不需要编译的解释型语言,也要构建成一个压缩包或 Docker 镜像再去部署。无论是在开发阶段还是 CICD 阶段,都离不开构建过程,构建的质量和效率对持续交付影响很大。影响构建效率的因素,包括源码以及构建的依赖。

背景

在阿里巴巴,Java 是被最多人使用的编程语言。在 Java 的构建工具中,由于迁移成本,生态等原因,Maven 一直是服务端应用的最主要构建工具。

Maven 构建性能问题主要有二方面原因。一是外因,从应用角度看,一些 Java 应用历史悠久,依赖不断增加,并因为清理有风险导致累积太多,典型应用有 3000 个 Jar 包依赖,而且这些应用研发人员多,且是跨团队的,导致依赖管理成本高,依赖变得复杂混乱。二是内因,从 Maven 本身来看,它对复杂依赖的处理考虑欠妥。

对于外因,需要业务团队建立依赖梳理管理机制。针对内因,我们对 Maven 进行了重新实现,推出了 AMaven。

另一方面,阿里巴巴有 15%的 C/C++应用。C/C++应用与 Java 的最大区别是:Java 应用构建次数频繁,但每次构建时间短;C/C++应用构建次数少,但一次构建时间长。如某些软件的构建长达 10 多个小时。所以C/C++开发同学的痛点,除了构建慢外,最不能忍受的还是等了 10 多个小时,最后几分钟居然构建失败了。

那为什么 C/C++构建慢且容易失败呢?

原因主要有两个:

  1. 现有框架无法保证 C/C++编译和链接的严谨性,导致编译结果不确定,运行时也不稳定。举个例子,在编译阶段,同名的头文件在不同时间或不同机器上会可能内容不同,所以编译容易失败。
  2. 公司内编译框架众多,有 scons,cmake 等,造成团队之间业务转接成本高,编译问题排查成本高。从平台角度看,也无法触达用户真正的编译逻辑,无法统一性能调优,更进一步无法统一升级底层编译器 gcc,即无法享受新技术红利。所以构建慢。

相比 AMaven 是重新实现底层构建工具的 Maven,在 C/C++领域我们主要是建设上层的编译框架,推出了 Alimake,因为底层的 make 已经很优秀了。

接下来,我们具体来看看 AMaven 和 Alimake。

方案

AMaven

Maven 构建带来的性能问题,会严重影响持续交付的效率。主要体现在以下几点:

  1. 在 idea 中同步时间长,如典型应用需要 10 分钟左右。
  2. 单次编译时间长,如典型应用也需要 10 分钟左右。
  3. 构建步骤多,在一次交付过程中,不同环境都要构建。
  4. 在同一环境中往往会构建多次。

同时,构建性能问题也影响了开发同学的成就感。只写了几行代码,但一刷新工程,一本地编译,就一个上午过去了。一天下来,写代码的时间没等编译的时间多。

image.png
构建问题影响软件交付效率

一线研发同学,他的研发工作远不止体现在研发协同平台上的操作,在一个分支能进入集成前,有大部分研发工作都是在线下本地完成的。所以线下本地的提效也很重要。从新的 Java 构建工具 AMaven 开始,我们也将提效的视角范围从线上研发协同平台延伸到了一线研发本地。

基于 Maven 协议,遵循缓存,增量等思想,重新实现了一个工具:AMaven。同时在使用 AMaven 过程中,为保证它构建结果的准确性,在后台也会使用 Apache Maven 进行构建,并比较二者编译结果。同时又是基于 Maven 协议,对用户透明 ,从而做到"无成本,无风险"。

image.png
无成本,无风险

image.png
结果对比,保证无风险

AMaven 对症下药,主要通过建立依赖树,缓存依赖树,共享依赖树来解决依赖复杂问题。一个依赖树缓存是否有效,除了与源码中的 pom 文件有关,还与依赖的 snapshot 变化等有关。当 snapshot 变化时,依赖树缓存就会失效,而需要重新生成依赖树。为提高依赖树的生成效率,AMaven 还通过依赖遍历算法对依赖树生成进行了优化,并开放了遍历深度参数让用户来微调。

这些依赖树信息同时也会保存为制品的重要元数据,在"制品元数据"章节中会有详述。

image.png
依赖缓存与共享

除了利用缓存,增量等思想,AMaven 还做了 C/S 化。即将部分计算能力移到 server 端。使用 AMaven后,一次构建的流程变成如下图所示:

image.png
一次典型的 AMaven 构建

AMaven 还增加了循环依赖检测,动态执行插件等能力,虽不能直接提升构建速度,但加快了研发同学对依赖等构建问题的排查速度。

我们再来看看 AMaven 给用户带来的收益与效果。从线上 CICD 平台数据来看:AMaven 实现了 Java秒级构建,阿里巴巴的 Java 构建中有 44%在 30 秒内完成。其次,从依赖庞大的典型应用来看,提效可达 10 倍。

从线下研发本地数据来看:AMaven 无论是在命令行还是在 IDEA 中使用,都能将构建耗时降至 50%。特别是在 IDEA 中切换分支后刷新工程时,最快能在 10 秒内完成。

Alimake

Alimake 主要从两方面入手。

  1. 从"规范"入手。首先,建立全新的严格的配置文件 target,所有编译入参必须严格清晰的定义,它会被翻译成严谨的 makefile,它也同时在一定程度上培养了工程师严谨自律的文化。接着,建立了一个全新的仓库 alicpp,它统一存放了原本在编译机器上的依赖,从而保证编译的环境无关性,保障编译结果的强一致性。
  2. 从"效率"入手。它不但集成了业界优秀技术 ccache 和 distcc,而且还自研了分布式链接等技术。因为 Alimake 统一了入口,所以它不但能让专家经验规模化,统一调优编译参数,而且还能将升级编译器 gcc 机制化,让我们可以随心所欲,一直跟上编译器的进步。

Alimake 的架构思想与 AMaven 类似,也是将部分计算能力移到 server 端。利用 server 端一来能减轻client 端的资源消耗,解决 client 端由于硬件及配置带来的性能瓶颈,二来也能实现资源共享,如依赖缓存,中间产物缓存。

image.png
Alimake 架构

Alimake 覆盖阿里巴巴多个产品,包括:钉钉、阿里云存储、OSS、盘古、伏羲、蚂蚁人工智能等,平均提升构建效率 30%,最优情况下可以提效 70%。

小结

为提高构建效率,我们从空间(产物大小),及时间(通过工具来提升构建速度)二方面进行了优化。除此之外,还利用构建过程中产生的原生数据(如依赖关系),赋能于持续交付与安全生产等方面,以实现高效的可信的发布。

免费下载《阿里巴巴DevOps实践指南》

阿里巴巴合伙人和业界多位大佬力荐、何勉、陈鑫等17位阿里资深技术专家联袂出品、阿里十年DevOps经验沉淀总结、阿里巴巴DevOps落地实践一本通。

前往:https://developer.aliyun.com/topic/devops,下载完整版电子书。

image.png

相关文章
|
15天前
|
Kubernetes Devops 应用服务中间件
基于 Azure DevOps 与阿里云 ACK 构建企业级 CI/CD 流水线
本文介绍如何结合阿里云 ACK 与 Azure DevOps 搭建自动化部署流程,涵盖集群创建、流水线配置、应用部署与公网暴露,助力企业高效落地云原生 DevOps 实践。
134 1
|
6月前
|
Docker 容器 Perl
云效flow构建docker镜像更换apt源为阿里镜像源
在 Dockerfile 中添加命令以更换 Debian 源为阿里云镜像,加速容器内软件包下载。核心命令通过 `sed` 实现源地址替换,并更新 apt 软件源。其中 `cat` 命令用于验证替换是否成功,实际使用中可删除该行。
1216 32
|
8月前
|
监控 容器
云效构建在线调试来啦!保留构建现场,高效排查构建问题
阿里云云效「构建在线调试」功能全新上线,助您一键开启 Debug 模式,在线高效调试,轻松解决构建难题!
254 103
|
8月前
|
监控 容器
云效构建在线调试来啦!保留构建现场,高效排查构建问题
云效构建在线调试来啦!保留构建现场,高效排查构建问题
云效构建在线调试来啦!保留构建现场,高效排查构建问题
|
10月前
|
弹性计算 开发框架 安全
基于云效 Windows 构建环境和 Nuget 制品仓库进行 .Net 应用开发
本文将基于云效 Flow 流水线 Windows 构建环境和云效 Packages Nuget 制品仓库手把手教你如何开发并部署一个 .NET 应用,从环境搭建到实战应用发布的详细教程,帮助你掌握 .NET 开发的核心技能。
|
11月前
|
运维 监控 Devops
DevOps文化:持续交付与持续反馈的文化构建与实践
【10月更文挑战第26天】DevOps作为一种将开发与运维紧密结合的文化和实践,通过促进团队协作与自动化流程,实现快速、稳定且高质量的软件交付。本文重点探讨持续交付与持续反馈两大支柱,通过实际案例和示例代码,展示其构建与实践过程。例如,使用Jenkins构建CI/CD流水线,通过Grafana和Prometheus实现实时监控,确保软件质量和快速响应。
156 1
|
11月前
|
运维 Devops jenkins
DevOps文化:持续交付与持续反馈的文化构建与实践
【10月更文挑战第27天】DevOps文化强调开发和运维的紧密合作,以实现快速、高质量的软件交付。核心在于持续交付和持续反馈。本文探讨了如何通过改变组织结构、构建跨功能团队、使用自动化工具(如Jenkins)和积极收集用户反馈,来构建和实践DevOps文化。
150 0
|
Devops jenkins 持续交付
DevOps实践:构建和部署一个Docker化的应用
【9月更文挑战第14天】在当今快节奏的软件开发领域,DevOps已经成为提升效率、加速交付的关键。本文将引导你理解DevOps的核心概念,并通过一个实际的示例—构建和部署一个Docker化的应用—来深入探讨其实践方法。我们将从简单的应用出发,逐步实现Docker容器化,并最终通过CI/CD流水线自动化部署过程。这不仅是对DevOps流程的一次实操演练,也是对现代软件开发理念的一次深刻体验。
|
运维 监控 Devops
DevOps实践:构建高效运维流程
【9月更文挑战第3天】在当今快节奏的技术环境中,高效的运维流程是企业成功的关键。本文旨在揭示如何通过DevOps实践,构建一个既灵活又高效的运维体系。我们将深入探讨自动化工具、持续集成与持续部署(CI/CD)策略以及监控和日志管理的最佳实践,以实现运维工作的优化。文章将用简洁明了的语言,结合生动的比喻,带领读者走进DevOps的世界,学习如何将理论应用到实际工作中去。
|
前端开发 Java UED
JSF遇上Material Design:一场视觉革命,如何让传统Java Web应用焕发新生?
【8月更文挑战第31天】在当前的Web开发领域,用户体验和界面美观性至关重要。Google推出的Material Design凭借其独特的动画、鲜艳的颜色和简洁的布局广受好评。将其应用于JavaServer Faces(JSF)项目,能显著提升应用的现代感和用户交互体验。本文介绍如何通过PrimeFaces等组件库在JSF应用中实现Material Design风格,包括添加依赖、使用组件及响应式布局等步骤,为用户提供美观且功能丰富的界面。
186 0