gitlab ci:sbt 在每个阶段重新编译

Posted

技术标签:

【中文标题】gitlab ci:sbt 在每个阶段重新编译【英文标题】:gitlab ci: sbt recompiles in each stage 【发布时间】:2020-05-09 18:31:38 【问题描述】:

我正在尝试使用 sbt 制作我的第一个 gitlab ci 管道。 我正在尝试构建和测试阶段。

问题是,虽然我在构建时编译了项目,但它在运行测试之前在测试阶段再次编译。

有人可以帮助我了解为什么会发生这种情况以及如何解决它吗?

sbt 版本:1.2.7

这是我的 gitlab-ci.yml 文件:

image: docker-registry:5000/sbt-docker:latest

variables:

SBT_OPTS: "-Dsbt.global.base=sbt-cache/sbtboot -Dsbt.boot.directory=sbt-cache/boot -Dsbt.ivy.home=sbt-cache/ivy Dsbt.coursier.home=sbt-cache/coursier -Dsbt.io.jdktimestamps=true"

COURSIER_CACHE: sbt-cache/coursier

stages:
 - build
 - test

cache:
  paths:
    - "sbt-cache/ivy/cache"
    - "sbt-cache/boot"
    - "sbt-cache/sbtboot"
    - "sbt-cache/coursier"

build:
 stage: build
 script:
   - sbt -J-Xmx2G clean core/compile core/package
 artifacts:
   untracked: true
   paths:
     - "target/"


test:
  stage: test
  dependencies:
    - build
  script:
    - sbt core/test
  allow_failure: true

【问题讨论】:

你尝试过执行什么吗?当它按照您所说的再次编译时,它会退出吗?也许您可以进一步了解您要解决的具体问题。 您的 untrackedpaths 键似乎缩进不正确。这只是一个复制粘贴的问题吗? @Nelles 我尝试执行,一切正常,但问题是它需要很长时间,因为它在测试阶段再次编译 @cbley 是的,这是复制粘贴问题 当您在第二阶段运行sbt core/test 时,它可能看不到第一阶段的target/ 目录,因此它会重新从头开始编译源代码。您需要找到一种方法将此目录传递到下一阶段,使用工件和依赖项。 【参考方案1】:

您需要缓存项目的target/ 文件夹。我对 CircleCI 不熟悉,似乎有一个cache:paths 可用的密钥,只要缓存是每个分支,这听起来不错。

【讨论】:

以上是关于gitlab ci:sbt 在每个阶段重新编译的主要内容,如果未能解决你的问题,请参考以下文章

如何防止gitlab ci每次都下载sbt?

用于 Maven 部署的 Gitlab CI/CD 的适当阶段是啥?

Gitlab CI:找不到构建阶段的输出

是否可以使用没有docker的gitlab-ci将简单的Java Web应用程序部署到本地服务器?

如何防止SBT重新编译修改后的.class文件?

强制 sbt 重新加载整个构建定义