Google分布式构建软件之一:获取源代码
本文原文在google开发者工具组的博客上[需要FQ],以下是我的翻译,欢迎转载,但尊重作者版权,注名原文地址。
在Google,所有的产品都是在主干上开发的。这样的好处:每个人都可以查看和修改代码,避免了在分支上长时间开发后合并主干时候的痛苦,从源码构建也避免了库之间的二进制兼容问题。Google是跨国公司,这意味着分布在世界各地的办公室会放大下载代码的时间。通过计算依赖关系来限制下载的文件数量,我们成功地减少了代码下载的时间。然而,计算依赖关系也要花时间,而且即使这样改进了,获取源码的时间仍然很长。
最明显的代价是工程师花费在下载代码上的时间,而实际上的代价更高。自动化构建和测试需要访问源码。在这些系统中下载代码上花费的时间会增加整个过程的时间,同时也会增加这些系统的复杂度,因为他们需要在文件系统上维护状态并为了获得代码的只读权限而和版本控制系统紧密耦合。
实际上,我们发现工程师下载代码后修改的代码相对于执行构建需要的代码而言是非常小的一部分。因为我们所有的东西都是从代码构建的,而修改的只是源码树中的一小部分。所以,工程师和自动构建系统都需要对执行构建所需要的未修改的大量代码拥有一个更快,只读的访问方式。未修改的代码本身是没有发生变化的,因为自动提交到版本管理系统后,就没有改动过。这意味着我们可以使用Google的基础设施来在云上对所有的版本控制信息做镜像来对源码提供更快且可扩展的只读访问。
在我们系统中,每个文件的每个版本都有对应的元信息记录。元信息包含的信息包括:文件在代码库里面的路径信息,文件名称,大小,版本号等,也包含了针对这个版本的文件内容的摘要。这个摘要是使用适合基于内容寻址存储CAS的哈希函数来对文件内容的哈希。在系统中很多地方我们实现了CAS。在后续的文章会中读到更多的CAS内容。
/som/path/foo.c文件的第5个版本的元信息和CAS的文件内容看起来是这样的:
我们的系统监控版本控制系统中到来的修改。当发生修改后,我们哈希文件内容来计算摘要并把内容插入到BigTable存储系统中。然后我们计算每个受影响的文件的元数据信息并插入到BigTable中。这样我们就在云上拥有了所有文件的各个版本的完整历史。
现在我们有了这些数据,我们怎么使用它?我们在开发人员的本地机器上使用命令行工具来下载云端的代码。这样能够减少版本控制系统的负载,并由于使用的是在办公地点附近的云端数据拷贝,也会由于减少了网络时延而提升性能。我们实现的时候不是下载全部代码,而是自动按需下载代码,这非常有用。
上面提到的按需自动下载代码,可以通过实现一个定制的文件系统来完成,这个定制的文件系统提供对版本历史的只读访问。通过用户空间文件系统(File System in Userspace)可以很方便的用一个用户态空间里的守护进程来实现这样的文件系统。用户使用跟其他文件系统一样的方法来和这个源码文件系统交互,唯一差别是路径中有配置了版本信息的特殊元素。
例如,访问前面例子里提到的foo.cc文件的1000版本:
文件系统通过类似stat()和readdir()这样的调用来获得元信息,首先是从路径中解析出版本号,然后从云上获得版本控制数据。
例如,使用gcc(或者其他工具)来编译foo.cc,gcc首先调用stat()来检查文件是否存在:
这就允许用户和工具仅仅使用版本元数据来访问版本控制。文件内容只有在文件被打开的时候才会下载下来。由于文件版本是不可变的,所以文件内容可以缓存下来并无限次的重复使用[文件内容和元数据在本地有缓存]。CAS的使用同时也消除了文件内容的重复数据,相同的内容不会重复下载。
通过把版本历史存储在云端,我们就可以让开发人员访问到所有的代码的同时,还能够保证下载时间非常短。通过把云扩展到多个地理区域,就可以保证世界各地的办公区的性能都差不多。最终,自动化的构建和测试系统可以通过简单的文件系统接口来而很容易的获得代码而不用跟版本控制工具直接打交道。所有这些组成了一个快速高效的系统来保证工程师和自动化的系统可以专注于构建和测试软件而不是下载源码上。
如果您看了本篇博客,觉得对您有所收获,请点击右下角的“推荐”,让更多人看到!
Google分布式构建软件之一:获取源代码的更多相关文章
- Google分布式构建软件之二:构建系统如何工作
分布式软件构建第二部分:构建系统如何工作 注:本文英文原文在google开发者工具组的博客上[需要FQ],以下是我的翻译,欢迎转载,但请尊重作者版权,注名原文地址. 上篇文章中提到了在Google,所 ...
- Google分布式构建软件之三:分布式执行构建步骤
注:本文英文原文在google开发者工具组的博客上[需要FQ],以下是我的翻译,欢迎转载,但请尊重作者版权,注名原文地址. 之前两篇文章分别介绍了Google 分布式软件构建系统Blaze相关的为了提 ...
- Google分布式构建软件之四:分发构建结果
注:本文英文原文在google开发者工具组的博客上[需要FQ],以下是我的翻译,欢迎转载,但请尊重作者版权,注名原文地址. 之前的文章,介绍了Google在分布式构建软件过程中,如何把构建过程分发到许 ...
- Google 里的软件工程学
简评:原文作者 Fergus Henderson 在 Google 工作了 10 年以上,目前负责 Google 的 text-tospeech 工程小组.有很多书籍或文章会从 商业/管理 等非技术角 ...
- 基于Apache Hudi在Google云构建数据湖平台
自从计算机出现以来,我们一直在尝试寻找计算机存储一些信息的方法,存储在计算机上的信息(也称为数据)有多种形式,数据变得如此重要,以至于信息现在已成为触手可及的商品.多年来数据以多种方式存储在计算机中, ...
- 为什么google bazel构建工具流行不起来
作者Jack47 转载请保留作者和原文出处 之前博主写了系列文章Google软件构建工具Bazel原理及使用方法介绍.最近使用了一段时间后,觉得这个东西不是一种通用的构建工具,很难对接到情况复杂的大的 ...
- Android manifest 获取源代码
/********************************************************************************* * Android manifes ...
- jenkins 构建 job 并获取其状态的实现
目录 BACKGROUND INVESTIGATION I 1. 连续触发的相同 job 构建不会重复入队 2. 连续触发的不同 job 构建会各自入队 3. 参数变动的相同 job 构建将分别入队 ...
- Google开源SLAM软件cartographer中使用的UKF滤波器解析
在Google开源SLAM软件cartographer中,相对<SLAM for dummies>使用了更为复杂.性能更好的Scan匹配与UKF算法,这里简单介绍下cartographer ...
随机推荐
- SQL语句实现Split并合并查询结果
需求是这样的,需要将数据库中的支付方式列(用";"分割的字符串)按支付方式拆分: 首先参考博客园split的文章,我采用方法2, IF EXISTS ( SELECT * FROM ...
- Fiddler问题 - creation of the root certificate was not successful
打开cmd执行命令. d: cd D:\soft\Fiddler2 makecert.exe -r -ss my -n "CN=DO_NOT_TRUST_FiddlerRoot, O=DO_ ...
- jQuery 追加元素的方法如append、prepend、before,after(转)
1.jQuery append() 方法 jQuery append() 方法在被选元素的结尾插入内容. 实例 复制代码代码如下: $("p").append("Some ...
- pyqt 发射接收信号
翻页控件: 一.定义并发射信号: #!/usr/bin/python # #coding=utf-8 # __author__='' from PyQt4.QtCore import * from P ...
- bzoj1024搜索
进度1/10mark(感觉完不成了) 事实上我刚看到题目一下子慌了,,,我在想怎么二分一块的长宽,然后验证 然而极其难写 于是想有没有暴力,举一些例子模拟一下 然后发现切割是有很明显的限制的:每次切割 ...
- bzoj4491奇技淫巧线段树
20行的归并+10行的线段树(现在线段树真是越写越短了)+10行主程序(连主程序都缩过行) = =丧心病狂 struct里连开10个,用大括号直接初始化真是爽翻了 #include <cstd ...
- Shader实例:序列帧动画
效果: 序列帧图片网上随便找的,质量不是很好,重点不是它,不要在意. 思路: 1.之前都是在一张面片上直接映射一张纹理,IN.uv的范围是0~1 现在要映射一张纹理上的一小块区域,就要用这块区域的uv ...
- mysql问题总结
1. You are using safe update mode and you tried to update a table without a WHERE clause that uses a ...
- 使用GDB 追踪依赖poco的so程序,core dump文件分析.
前言 在windows 下 系统核心态程序蓝屏,会产生dump文件. 用户级程序在设置后,程序崩溃也会产生dump文件.以方便开发者用windbg进行分析. so,linux 系统也有一套这样的东东- ...
- Windows下ActiveMQ下载、安装部署
1.下载:http://activemq.apache.org/download.html 最新Windows版本 2.安装 (1) 首先配置JAVA环境变量 JAVA_HOME=D:\Progr ...