更新:我现在建议使用artifacts
简短的expire_in
. 这优于cache
因为它只需要在每个管道中写入一次工件,而在每个作业之后更新缓存。此外,缓存是每个运行器的,因此如果您在多个运行器上并行运行作业,则不能保证填充它,这与集中存储的工件不同。
Gitlab CI 8.2 添加了运行器缓存,可让您在构建之间重用文件。但是我发现这非常慢。
相反,我使用一些 shell 脚本实现了我自己的缓存系统:
before_script:
# unique hash of required dependencies
- PACKAGE_HASH=($(md5sum package.json))
# path to cache file
- DEPS_CACHE=/tmp/dependencies_${PACKAGE_HASH}.tar.gz
# Check if cache file exists and if not, create it
- if [ -f $DEPS_CACHE ];
then
tar zxf $DEPS_CACHE;
else
npm install --quiet;
tar zcf - ./node_modules > $DEPS_CACHE;
fi
这将在您的每个作业之前运行,.gitlab-ci.yml
并且仅在package.json
已更改或缓存文件丢失(例如第一次运行或文件被手动删除)时安装您的依赖项。请注意,如果您在不同的服务器上有多个运行器,它们每个都有自己的缓存文件。
您可能需要定期清除缓存文件以获取最新的依赖项。我们使用以下 cron 条目执行此操作:
@daily find /tmp/dependencies_* -mtime +1 -type f -delete