替换 setup-go 让 Golang CI 提速 69%
Scaling Golang CI by Replacing actions/setup-go

我们发现通过利用 Golang 构建缓存,可以大幅提升并行 CI 工作流的效率。在 CloudX 的 monorepo 中,我们将 GitHub 官方的 actions/setup-go 替换为自研的 cloudx-io/setup-go,测试任务运行时间直接减少了 69%。官方方案在并行作业时存在缓存键设计缺陷,导致缓存迅速失效且多任务间发生竞争,使得 86% 的测试工作完全多余。我们的新方案通过为每个任务生成独立缓存键,并每次运行后更新缓存,彻底解决了这一问题。这不仅让测试更精准,还显著降低了等待时间。
回测显示,默认动作所做的 86% 工作完全是多余的。
HN 评论区
19- wannabe44
我一直主张为 CI 使用自定义构建的 docker 镜像,并定期更新以修复安全漏洞。CI 的运行时间不应比在开发机上运行相同任务的标准时间多出几秒。
然而,我周围的人似乎对每次 CI 运行时都从全局镜像源执行 apt 和 pip 安装感到满意。所以我可能只是有点‘阿斯伯格’。
- vbernat
我将 cache 设置为 `false`,并直接使用 actions/cache:
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
if: ${{ inputs.setup-go == 'true' }}
with:
path: |
${{ env.gocache }}
${{ env.gomodcache }}
key: ${{ runner.os }}-${{ runner.arch }}-go${{ steps.go-setup.outputs.go-version }}-${{ hashFiles('go.sum') }}-${{ env.today }}
restore-keys: |
${{ runner.os }}-${{ runner.arch }}-go${{ steps.go-setup.outputs.go-version }}-${{ hashFiles('go.sum') }}-
${{ runner.os }}-${{ runner.arch }}-go${{ steps.go-setup.outputs.go-version }}-
这样每天都会生成一个新的缓存,如果你是当天第一个运行的任务,仍然可以加载最新的缓存。
- camdenclark
另外,如果你在任何规模下运行 CI,都应该有一个代理(agent)持续优化 CI,并在出现性能回退或不稳定问题时向你发出警报。这是代理可以在后台完成并为你团队提交 PR 的工作。