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

时间:2016-06-27 12:56:08

标签: haskell gitlab-ci haskell-stack

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

要缓存我添加的本地数据库

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

(堆栈YAML文件位于src/utils/,三个Haskell包也存在于dirs中。)

但这并没有真正加快构建速度。在仔细阅读stack databases后,我意识到快照已放入STACK_ROOT~/.stack)。研究堆栈选项表明无法指定快照应与STACK_ROOT分开存储。

鉴于Gitlab CI似乎只允许在构建目录中缓存项目,我认为我有两个选择:

  • 使用stack --stack-root <folder under build> ...STACK_ROOT置于构建目录中,然后缓存整个内容。这意味着我的缓存从不到100M变为大约1.6G!
  • 将我们当前正在进行的快照预取到我们用于构建的docker镜像中。

现在提出我的问题:

  • 我是否认为快照始终存储在STACK_ROOT
  • 有没有办法预取特定快照,类似于stack setup抓取ghc的方式?

或许我完全错了,并且有更好的途径来限制缓存大小。

1 个答案:

答案 0 :(得分:1)

在@dsign的评论和一点思考后,我找到了一个令人满意的解决方案:

  • 是的,在docker image构建过程中预先构建软件一次就可以了。
  • 预取的方法是运行stack install --only-dependencies