背景
云原生下的流水线是通过启动容器来运行具体的功能步骤,每次运行流水线可能会被调度到不同的计算节点上。这会导致一个问题:容器运行完是不会保存数据的,每当流水线重新运行时,又会重新拉取代码、编译代码、下载依赖包
等等。在云原生场景下,不存在本地宿主机编译代码、构建镜像时缓存的作用
,大大延长了流水线运行时间,浪费很多不必要的时间、网络和计算成本。在许多流水线场景中,同一条流水线的多次执行之间是有关联的。如果能够用到上一次的执行结果,则可以大幅缩短执行时间。为了提高用户使用流水线的体验,我们加入支持缓存的功能,挂接远程储存管理构建缓存,可以实现同一个项目的编译依赖复用,在同一条流水线的多次运行中,共享同一份缓存。
_, err = c.ScriptAction.Sh([]string{
"sh",
"-c",
"modprobe fuse;cd /export/servers/tools/cfs;sudo ./cfs-client-randomwrite -c fuse.json",
})
依赖包的大小 | 465M | 压缩效率 |
---|---|---|
tar 压缩 | 423M | 14s 左右 |
zstd 压缩 | 205M | 1s 左右 |
・检查是否命中缓存:根据缓存 key,判断缓存是否命中
缓存 key | 缓存的唯一标识 |
---|---|
不同语言编译原子 | 根据下载代码的代码库地址自动获取 设置的缓存 key:home_auth/home-auth-center |
用户自定义镜像 | 自定义缓存 key |
・pull 缓存
当缓存命中后,根据缓存路径,找到挂载到 cfs 上的缓存压缩包,解压到指定的缓存目录下・push 缓存:将依赖包进行压缩,放到 cfs 的挂载目录下
依赖包的大小 | 465M |
---|---|
tar 压缩 | 423M |
zstd 压缩 | 205M |
Watch
指定的键、前缀目录的更改,并对更改时间进行通知。BASE 引擎中,缓存的清除策略借助 etcd 来实现。缓存过期策略:在编译加速的实现中,每个需要缓存的项目都有对应的缓存 key,通过 etcd 监控 key,并且设置过期时间,例如 7 天,如果在 7 天之内再次命中 key,则通过 lease 进行续约;7 天之内 key 都没有被使用,key 就会过期删除,通过监听对应的前缀,在过期删除的时候,调用删除缓存的方法。
storage.Watch("cache/",
func(id string) {
//do nothing
},
func(id string) {
CleanCache(id)
})
| BASE 执行 |
---|---|
无缓存 | 平均时间:5.26min |
有缓存 | 平均时间:41.462s |
提升效率 | 提升 87.3% |
缓存命中率 | 接近 100% |
| BASE 执行 |
---|---|
无缓存 | 平均时间:58s |
有缓存 | 平均时间:29s |
提升效率 | 提升 50% |
缓存命中率 | 接近 100% |
$GOCACHE
环境变量控制,将 $GOCACHE
的内容压缩成 zstd 的包,上传到 cfs 的指定路径下。pull 缓存的时候,拉取到对应的 $GOCACHE。
| BASE 执行 |
---|---|
无缓存 | 平均时间:117s |
有缓存 | 平均时间:18s |
提升效率 | 提升 84.6% |
缓存命中率 | 接近 100% |
| BASE 执行 |
---|---|
无缓存 | 平均时间:21min57s 其中 maven: 17min83s nodejs: 4min19s |
有缓存 | 平均时间:4min20s 其中 maven: 1min10s nodejs: 2min36s |
缓存效率提升 | maven:93.7% nodejs:39.8%(nodejs 编译中有包含单元测试) |
缓存命中率 | 接近 100% |
・不同编译原子,向用户开放配置,如是否开启缓存,设置缓存 key
・实现不同语言编译原子增量 push 缓存功能
审核编辑 :李倩
全部0条评论
快来发表一下你的评论吧 !