我在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项目的最佳方法呢?
答案 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