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

Den*_*met 5 makefile gitlab-ci gitlab-ci-runner

我在我的 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
Run Code Online (Sandbox Code Playgroud)

我想,如果我将添加binbuild迪尔斯到缓存中,make每次都不会重建整个项目(就像它在当地的行为),但似乎什么CI亚军重写我的srcDIR每一次,所以时间戳的文件正在也更新了,并make认为每个文件都更新了。我想将srcdir 包含在缓存中,但它包含在 repo 中,我不确定这是否正确。那么,使用以前构建的二进制文件重建 gitlab ci 项目的最佳方法是什么?

小智 1

我看到您正在使用 $CI_BUILD_REF 作为缓存键;尽管此变量已被弃用,但它似乎可以工作并提供提交的 SHA1。这真的是您想要的吗,为每个提交创建单独的缓存(甚至不是每个分支)?那么对于任何新的提交,无论如何都不会有缓存?

我什至可能会使用静态缓存键来最大化缓存(同时使用最小的缓存存储),或者可能每个分支。

也许 Git 签出和/或分支开关太频繁地接触源文件。我在我的一个项目中实施了类似的策略,但在那里我有一个独特的“缓存”文件夹,用于/rsync/结账时的文件。

Gitlab.com 的共享运行程序在使用缓存时似乎确实保持了文件修改时间不变,甚至在主结帐时也是如此。

我已经建立了一个带有 CI 作业的示例项目,演示了https://gitlab.com/hannibal218bc/test-build-cache-xtimes/-/jobs/1022404894的事实:

  • 作业stats 目录的内容
  • 创建一个cached目录(如果尚不存在)
  • 复制README.md文件
  • 将文件“编译”为README.built文件。

正如您在输出中看到的,修改时间戳是README.built上一个作业的运行时间:

$ cd cached
$ stat README.* || true
  File: README.built
  Size: 146         Blocks: 16         IO Block: 4096   regular file
Device: 809h/2057d  Inode: 2101510     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-02-10 23:06:13.000000000 +0000
Modify: 2021-02-10 23:02:39.000000000 +0000   <<< timestamp from previous job
Change: 2021-02-10 23:06:13.000000000 +0000
Run Code Online (Sandbox Code Playgroud)