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

时间:2018-01-30 12:56:03

标签: makefile gitlab-ci gitlab-ci-runner

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

return cng.DeriveKeyMaterial(CngKey.Import(publicKey2, CngKeyBlobFormat.EccPublicBlob));

我想如果我将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 bin dirs添加到缓存中,build每次都不会重建整个项目(就像它在本地行为一样),但是似乎CI运行者每次都会覆盖我的make目录,因此文件的时间戳也会被更新,src认为每个文件都会更新。我考虑将make dir包含在缓存中,但它包含在repo中,我不确定这是否正确。那么,哪个是使用以前构建的二进制文件重建gitlab ci项目的最佳方法呢?

1 个答案:

答案 0 :(得分:0)

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

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

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

Gitlab.com 的共享运行程序似乎在使用缓存时,甚至在主要结帐时都保持文件修改时间不变。

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

  • 作业stat是目录的内容
  • 创建一个 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