在Gitlab CI中缓存构建之间的堆栈数据库



我有一个使用CMake构建的大型多语言项目。其中有一部分是用Haskell编写的,它使用stack来构建。CI构建由Gitlab CI处理,并在docker执行器中运行。在创建docker镜像期间,使用stack setup下载ghc。构建的haskell部分仍然需要相当长的时间,因为它为每个构建重新下载和构建所有必需的包。

为了缓存本地数据库,我添加了

cache:
  paths:
    - src/utils/.stack-work

(堆栈YAML文件位于src/utils/中,三个Haskell包也位于那里的dirs中)

这并没有真正加快构建的速度。在更仔细地阅读了堆栈数据库之后,我意识到快照被放在STACK_ROOT (~/.stack)中。研究堆栈的选项表明,没有办法指定快照应该与STACK_ROOT分开存储。

考虑到Gitlab CI似乎只允许在构建目录中缓存项目,我认为我剩下两个选项:

  • 使用stack --stack-root <folder under build> ...STACK_ROOT放在构建目录中,然后缓存整个内容。这意味着我的缓存从不到100M增加到1.6G!
  • 预取我们当前使用的快照到我们用于构建的docker映像中。

现在是我的问题:

  • 我是否认为快照总是存储在STACK_ROOT中?
  • 是否有一种方法可以预取特定的快照,类似于stack setup如何获取ghc?

或者我完全错了,有更好的方法来限制缓存大小。

经过@dsign的评论和一点思考,我得出了一个令人满意的解决方案:

  • 是的,在docker映像构建过程中通过(某种程度上)构建软件来预抓取是可以的。
  • 预取方式为运行stack install --only-dependencies

最新更新