Caching GitLab CI:合并还是替换缓存?
我正在使用GitLab CI 在构建阶段,我有两份工作构建我的应用程序。这两个作业上载分支的缓存。我使用编译的源代码在测试阶段启动一些测试Caching GitLab CI:合并还是替换缓存?,caching,continuous-integration,gitlab,gitlab-ci,Caching,Continuous Integration,Gitlab,Gitlab Ci,我正在使用GitLab CI 在构建阶段,我有两份工作构建我的应用程序。这两个作业上载分支的缓存。我使用编译的源代码在测试阶段启动一些测试 build: stage: build script: - ./gradlew build --build-cache --quiet cache: key: ${CI_COMMIT_REF_SLUG} paths: - "*/build" build_with_different_conf: stage:
build:
stage: build
script:
- ./gradlew build --build-cache --quiet
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- "*/build"
build_with_different_conf:
stage: build
script:
- ./gradlew buildDiff --build-cache --quiet
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- "*/build"
Test:
stage: test
script:
- ./gradlew test --build-cache
在我的示例中,具有不同配置的作业build_需要更多的时间来完成
我的问题是:最后一个完成的构建作业是上载缓存并替换第一个构建作业中的缓存,还是将文件与前一个作业合并
谢谢。据我所知,您正在使用全局缓存处理渐变依赖项。 而不是你想要某种工作,工作缓存 我或多或少会这样做
stages:
- build
- test
cache:
paths:
- <your_gradle_cache>
build_classes:
stage: build
script:
- ./gradlew build --build-cache --quiet
artifacts:
expire_in: 1d
paths:
- <your_build_dir>
build_war:
stage: build
dependencies:
- build_classes
script:
- ./gradlew buildDiff --build-cache --quiet
artifacts:
expire_in: 1w
paths:
- <path_to_your_war>
test_classes:
stage: test
dependencies:
- build_war
script:
- ./gradlew test --build-cache
test_war:
stage: test
dependencies:
- build_war
script:
- test # some kind of test to assure your war is in good condition
别忘了你可以使用shell或者任何你的跑步者的操作系统来调试,了解更多。你可以把ls-la放得到处都是
build:
stage: build
同一阶段作业并行运行
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- "*/build"
缓存文件由Cache:key管理。这意味着,如果您为不同的作业使用相同的cache:key,即使您定义了不同的cache:path,它们也会在作业之间共享相同的cache.zip文件。如果您使用的是相同的密钥,但路径不同,则缓存将无效,因为每个作业都将使用不同的路径内容覆盖cache.zip文件
在您的情况下,在不同的作业中使用相同的cache:key
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- "*/build"
这意味着上一个完成的作业将覆盖cache.zip文件而不是合并,并将用于下一个作业和定义了相同密钥的后续管道作业
奖金:
Test:
stage: test
script:
- ./gradlew test --build-cache
还要注意,如果此作业需要存在*/build目录内容,则必须小心,最好使用工件。缓存并不总是存在,它是作为尽力而为的交付提供的
例如,我像这样使用gitlab ci的缓存
nodejs_test:
stage: test
image: node:12.13-alpine
before_script:
- npm install
script:
- yarn test
cache:
key:
files:
# New cache key will be computed on each package.json change.
- package.json
paths:
- node_modules/
nodejs_build:
stage: build
image: node:12.13-alpine
before_script:
# In case if we miss cache, we can simply install packages again.
# If cache is there npm install won't download them again.
- npm install
script:
- yarn build
cache:
policy: pull # totally optional
key:
files:
- package.json
prefix: ${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
请您再解释一下,为什么要对分支使用缓存,这是什么意思。给出一些code.yml示例。我编辑添加了更多上下文首先,我认为您需要使用缓存,在这种情况下,您需要使用人工制品来传输构建结果。缓存通常用于传输一些依赖项或其他不经常移动的东西,比如npm节点模块。我建议您花一些时间在工件文档上。根据我了解的情况,您希望在一个作业中构建,而不是使用构建结果来加速测试。Build1和build2只是不同的入口点。对吗?或者,您会让build1而不是使用结果来加速build2并进行测试吗?尽管如此,您的构建作业结果可以是。类的工件,而该工件的寿命可以是五分钟/小时。而不是在下面的作业中使用这个编译的类,你可以构建你的战争。您的后续工作只需依赖于先例,这样它们就可以传输工件。我仍然会在我的第一条评论中指出,缓存可能会被误用,但它并不是它的主要角色。是的,一开始我确实到处使用ls和pwd来理解容器结构。可以对缓存内容进行双重检查;对于人工制品的使用,我不确定。我将明确地将war用作工件,并在部署阶段使用它,但构建目录可以改进同一分支中下一管道的构建。如果我错了,请纠正我,但工件更适合在同一管道中使用。有了缓存,我可以在下一个分支管道中重新使用它,以加速构建。感谢所有的提示;在这种情况下${CI\u COMMIT\u REF\u SLUG}应该可以工作。对于缓存密钥,witch应该与分支相关。好吧,要么你全局地定义它,这样整个ci就会使用它。或者你把它留给每个作业,这样只有一个作业序列使用它。这可能与gradle有关,在这方面我没什么可说的。
nodejs_test:
stage: test
image: node:12.13-alpine
before_script:
- npm install
script:
- yarn test
cache:
key:
files:
# New cache key will be computed on each package.json change.
- package.json
paths:
- node_modules/
nodejs_build:
stage: build
image: node:12.13-alpine
before_script:
# In case if we miss cache, we can simply install packages again.
# If cache is there npm install won't download them again.
- npm install
script:
- yarn build
cache:
policy: pull # totally optional
key:
files:
- package.json
prefix: ${CI_COMMIT_REF_SLUG}
paths:
- node_modules/