我有一个带有gitlab-runner 10.3.0和kubernetes执行器的kubernetes集群。在runner的config.toml文件中没有定义cache_dir
。请注意,这与docker执行程序不同,因此volume-solutions不适用。
在.gitlab-ci.yml
中,我将作业配置为使用缓存:
build:
cache:
key: "${PROJECT_NAME}"
paths:
- "node_modules/"
script:
- ls node_modules/ || echo "cache not there"
- npm i
- npm build
- ...
当我运行它时,我看到缓存被拉出并创建:
Cloning repository for some-branch with git depth set to 1...
Cloning into '/group/projectname'...
Checking out d03baa31 as some-branch...
Skipping Git submodules setup
Checking cache for projectname...
Successfully extracted cache
$ docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
//
// ...work being done here...
//
Creating cache projectname...
node_modules/: found 24278 matching files
Created cache
Job succeeded
但是,当我将另一个提交推送到此分支时,ls node_modules/
仍然找不到缓存。
我搜索了文档,但没有找到有关如何激活缓存的任何信息。 gitlab-runner-pod也没有任何所谓的缓存文件和according to the documentation,配置中的cache_dir
不被kubernetes执行者使用。
但根据this feature page,kubernetes执行者 支持缓存。
那怎么办呢?
答案 0 :(得分:4)
由于Kubernetes的分布式特性,您需要配置中央缓存位置(通常以与AWS S3或Minio等S3兼容的对象存储的形式)。这背后的原因在Gitlab runner documentation(强调我的)中解释:
为了加快构建速度,GitLab Runner提供了一种缓存机制,用于保存选定的目录和/或文件,并在后续版本之间共享。
当构建在同一主机上运行时,这很正常,但是当您开始使用Runners自动缩放功能时,大多数构建将在新的(或几乎是新的)主机上运行,该主机将执行每个构建一个新的Docker容器。在这种情况下,您将无法利用缓存功能。
为了解决此问题,与自动缩放功能一起引入了分布式Runners缓存功能。
它使用任何与S3兼容的服务器来共享使用过的Docker主机之间的缓存。在恢复和存档缓存时,GitLab Runner将查询S3服务器并下载或上传存档。
为此,您可以在跑步者配置中使用[runners.cache] section
:
[runners.cache]
Type = "s3"
ServerAddress = "s3.amazonaws.com"
AccessKey = "AMAZON_S3_ACCESS_KEY"
SecretKey = "AMAZON_S3_SECRET_KEY"
BucketName = "runners"
BucketLocation = "eu-west-1"
Insecure = false
Path = "path/to/prefix"
Shared = false