是否可以在Gitlab CI中仅重建更新的文件?

问题描述 投票:4回答:1

我正在Gitlab CI构建阶段使用此脚本(仅显示相关部分:]

cache:
  key: "$CI_BUILD_REF"
  paths:
    - bin/
    - build/

build:
  image: <my_build_image>
  stage: build
  script:
    - "make PLATFORM='x86_64-linux-gnu' BUILD='release' JOBS=8 all"
  only:
    - master
    - tags
    - merge-requests
  artifacts:
    untracked: true
    paths:
      - bin/x86_64-linux-gnu/release

[我以为如果将binbuild dirs添加到缓存中,make不会每次都重新构建整个项目(就像它在本地一样),但是CI运行程序似乎覆盖了我每次src目录,因此文件上的时间戳也将被更新,make认为每个文件都已更新。我曾考虑过将src dir包含到缓存中,但是它包含在回购中,我不确定这是正确的。那么,哪种方法是使用先前构建的二进制文件重建gitlab ci项目的最佳方法?

makefile gitlab-ci gitlab-ci-runner
1个回答
0
投票

由于我尚无法评论...作为“答案”。

我正面临着完全相同的问题。 (导致大量的流水线时间和审阅者的沮丧...)

我的权衡取舍在:

  • 缓存太少内容=>冗长(不需要)重建
  • 缓存太多事物=>由于过时的缓存而导致错误的否定管道
    • gitlab-runner首先检出更改,然后然后(下载)加载缓存,因此检入可能更改的源代码不是一个好主意。
Fetching changes...
Reinitialized existing Git repository in ...  <====
Checking out deadbeef as my-branch...
Removing build/untracked-dir0/
Removing untracked-dir1/
Removing lib/archive/untracked-dir2/
Checking cache for my-branch-cache... <====
No URL provided, cache will not be downloaded from shared cache server. Instead a local version of cache will be extracted. 

[我已经尝试或将来要研究的内容:

  • 相对较新的CI指令:rules:changes,因此如果仅触摸文档文件,请勿触发构建作业。
  • [rules:changes似乎显示了很好的“触摸日期”,因此可以是评估这些“更新日期”的更手动的解决方案,并且只有在触摸了相关文件的情况下才调用git log -1 --pretty="format:%ci"
  • 确定依赖项的构建热点(对我们而言,opensl的​​旧版本,只能使用make构建),您不会接触,但仍从源代码构建(例如,具有ASan或其他编译器选项),并且将它们(包括源文件)添加到缓存中。

您是否找到其他解决方案(您的问题已经2岁了?

© www.soinside.com 2019 - 2024. All rights reserved.