GitLab CI构建阶段之间的缓存依赖关系

时间:2018-11-24 11:13:05

标签: docker continuous-integration sbt gitlab

我有以下GitLab yml文件,并且假设每个阶段都将保留依赖项,所以我已分阶段编写了该文件,但事实并非如此!

# This file is a template, and might need editing before it works on your project.
# Official Java image. Look for the different tagged releases at
# https://hub.docker.com/r/library/java/tags/ . A Java image is not required
# but an image with a JVM speeds up the build a bit.
image: java:8

variables:
  FILE_TARGET_PATH: $FILE_TARGET_PATH

stages:
  - test
  - run

cache:
  key: "$CI_BUILD_REF_NAME" # contains either the branch or the tag, so it's caching per branch
  untracked: true
  paths:
    - "sbt-cache/.ivy.cache"
    - "sbt-cache/.boot"
    - "sbt-cache/.sbtboot"
    - "sbt-cache/target"

before_script:
  # Enable the usage of sources over https
  - apt-get update -yqq
  - apt-get install apt-transport-https -yqq
  # Add keyserver for SBT
  - echo "deb http://dl.bintray.com/sbt/debian /" | tee -a /etc/apt/sources.list.d/sbt.list
  - apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823
  # Install SBT
  - apt-get update -yqq
  - apt-get install sbt -yqq

Run unit Tests:
  stage: test
  tags:
    - master
  script:
    # Execute your project's tests
    - sbt -Denv=test clean test

Run Pipeline:
  stage: run
  tags:
    - master
  script:
    # Execute the pipeline
    - sbt -Denv=test run

如何在此多阶段设置中缓存依赖项?我的机器上有一个运行管道的本地运行程序。文物可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

如果您使用的SBT版本高于1.0.4,则缓存将对您不起作用,因为编译器将始终使所有文件无效。 此编译器问题已在此处报告:https://github.com/sbt/sbt/issues/4168

我的建议是将CI的sbt版本降级到1.0.4。如果这样做没有帮助,您还可以通过添加到build.sbt中来检查导致缓存无效的原因:

// Debug incremental zinc compiler
logLevel := Level.Debug
incOptions := incOptions.value.withApiDebug(true).withRelationsDebug(true)

我在Bitbucket Pipelines CI上遇到了同样的问题,并设法使其here成功地工作了