gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:59:55 25 4
gpt4 key购买 nike

我们有一个 play2/scala我们正在使用 gitlab ci 构建的应用程序。

我们的.gitlab-ci.yml (至少是重要部分)如下所示:

image: hseeberger/scala-sbt

variables:
SBT_GLOBAL_BASE_DIR: "$CI_PROJECT_DIR/cache/.sbt"
IVY2_CACHE_DIR: "$CI_PROJECT_DIR/cache/.ivy2"
SBT_BOOT_DIR: "$CI_PROJECT_DIR/cache/.sbt/boot"
M2_HOME_DIR: "$CI_PROJECT_DIR/cache/.m2"

before_script:
# Log the sbt version
- sbt sbt-version

build:
stage: build
script:
- ./build.sh

build.sh :
sbt -Dsbt.global.base=$SBT_GLOBAL_BASE_DIR \
-Dsbt.ivy.home=$IVY2_CACHE_DIR \
-Dsbt.boot.directory=$SBT_BOOT_DIR \
compile

不幸的是,我们的管道在所有步骤(构建、验证、部署)中总是运行大约 30-40 分钟。大部分时间花在下载 sbt上一遍又一遍真的很烦人。

我可能对 gitlab ci runners 了解不够但据我了解,使用 hseeberger/scala-sbt如图, sbt应该是全局可用的,应该不需要下载它。

然后还有 this不需要 gitlab 的解决方案。

无论如何,如果 sbt 我会很高兴每次部署期间,只要服务器运行任何 sbt,就不会总共下载 6 次命令。

谁能解释我如何使用权利 imageimage以正确的方式或其他方式我如何缓存 sbt东西?

更新

在过去的几天里,我和 docker 打了很多仗和 gitlab ci .我发现这个问题和 don't downloading the internet 中描述的差不多。 .拥有所有依赖项似乎是一项艰巨的任务,最好通过挂载它们来完成。不幸的是,这在共享的 gitlab ci 运行器上是不可能的。

我继续发现 sbt-docker它允许您从 build.sbt 构建 docker 容器文件。与 package basic approach我尝试将项目的所有本地可用依赖项作为 global sbt plugins 包含到容器中。 .但这也无济于事。

我最后的发现是关于 maven solution 的答案。并试图将其翻译成我们的 sbt项目:

.gitlab-ci.yml
image: hseeberger/scala-sbt

variables:
MAVEN_OPTS: -Dmaven.repo.local=/cache/maven.repository

stages:
- build
- test
- staging
- deploy

build:
stage: build
script:
- sbt compile -Dsbt.ivy.home=/cache/.ivy2 -Dsbt.global.base=/cache/.sbt/0.13 -Dsbt.boot.directory=/cache/.sbt/boot -Dsbt.repository.config=/cache/.sbt/repositories

我可以访问 gitlab ci再次记录。它们看起来基本上如下:
[info] Loading project definition from /builds/kwiqjobs/backend/project
[info] Updating {file:/builds/kwiqjobs/backend/project/}backend-build...
[info] Resolving com.typesafe.play#sbt-plugin;2.5.4 ...

[info] Resolving com.typesafe.play#sbt-plugin;2.5.4 ...

[info] Resolving com.typesafe.play#sbt-routes-compiler_2.10;2.5.4 ...

[info] Resolving com.typesafe.play#sbt-routes-compiler_2.10;2.5.4 ...

[info] Resolving org.scala-lang#scala-library;2.10.6 ...

[info] Resolving com.typesafe.play#twirl-api_2.10;1.1.1 ...

[info] Resolving com.typesafe.play#twirl-api_2.10;1.1.1 ...

... a **lot** more

[info] [SUCCESSFUL ] com.typesafe.sbt#sbt-twirl;1.1.1!sbt-twirl.jar (1033ms)
[info] downloading https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/com.typesafe.sbt/sbt-native-packager/scala_2.10/sbt_0.13/1.0.3/jars/sbt-native-packager.jar ...
[info] [SUCCESSFUL ] com.typesafe.sbt#sbt-native-packager;1.0.3!sbt-native-packager.jar (954ms)
[info] downloading https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/com.typesafe.sbt/sbt-web/scala_2.10/sbt_0.13/1.3.0/jars/sbt-web.jar ...
[info] [SUCCESSFUL ] com.typesafe.sbt#sbt-web;1.3.0!sbt-web.jar (1010ms)
[info] downloading https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/com.typesafe.sbt/sbt-js-engine/scala_2.10/sbt_0.13/1.1.3/jars/sbt-js-engine.jar ...
[info] [SUCCESSFUL ] com.typesafe.sbt#sbt-js-engine;1.1.3!sbt-js-engine.jar (1147ms)
[info] downloading https://repo1.maven.org/maven2/com/typesafe/play/twirl-api_2.10/1.1.1/twirl-api_2.10-1.1.1.jar ...
[info] [SUCCESSFUL ] com.typesafe.play#twirl-api_2.10;1.1.1!twirl-api_2.10.jar (89ms)
[info] downloading https://repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4.jar ...
[info] [SUCCESSFUL ] commons-io#commons-io;2.4!commons-io.jar (48ms)

a **lot** more
[info] Done updating.
[info] Compiling 228 Scala sources and 4 Java sources to /builds/kwiqjobs/backend/target/scala-2.11/classes...
[info] 'compiler-interface' not yet compiled for Scala 2.11.8. Compiling...
[info] Compilation completed in 17.735 s
[success] Total time: 149 s, completed Jan 20, 2017 2:22:52 PM
Build succeeded

我想摆脱所有的下载。

最佳答案

如果您不想使用自定义图像,最好的解决方案是使用 Gitlab CI 的 caching mechanism .

做对有点困难,但是 this blog post描述了如何为 SBT 做到这一点。

示例 .gitlab-ci.yml
引用自博文,我自己纠正的小错误:

# some parts originally from https://github.com/randm-ch/units-of-information/blob/master/.gitlab-ci.yml

image: "hseeberger/scala-sbt"

variables:
SBT_VERSION: "0.13.9"
SBT_OPTS: "-Dsbt.global.base=sbt-cache/.sbtboot -Dsbt.boot.directory=sbt-cache/.boot -Dsbt.ivy.home=sbt-cache/.ivy"

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"

stages:
- test

test:
script:
- sbt test

第二个例子,也包括 apt-get缓存

这是我在项目中使用的,可用于更一般的用例和 Docker 镜像:
image: java:8

stages:
- test

variables:
SBT_VERSION: "0.13.9"
SBT_OPTS: "-Dsbt.global.base=sbt-cache/.sbtboot -Dsbt.boot.directory=sbt-cache/.boot -Dsbt.ivy.home=sbt-cache/.ivy"
SBT_CACHE_DIR: "sbt-cache/.ivy/cache"

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

before_script:
- export APT_CACHE_DIR=`pwd`/apt-cache
- mkdir -pv $APT_CACHE_DIR
- ls $APT_CACHE_DIR || echo "no apt-cache dir found"
- apt-get -o dir::cache::archives=$APT_CACHE_DIR update -y
- apt-get -o dir::cache::archives=$APT_CACHE_DIR install apt-transport-https -y
# Install SBT
- mkdir -pv $SBT_CACHE_DIR
- ls $SBT_CACHE_DIR || echo "no ivy2 cache fir found"
- 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 642AC823
- apt-get -o dir::cache::archives=$APT_CACHE_DIR update -y
- apt-get -o dir::cache::archives=$APT_CACHE_DIR install sbt -y
- sbt -v sbtVersion

test:
stage: test
script:
- sbt -v sbtVersion

关于scala - 如何防止gitlab ci每次都下载sbt?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41698767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com