如何在Google Cloud Build中成功归档Yarn全局目录以复用缓存
解决Google Cloud Build中Yarn缓存为空/目录找不到的问题
核心问题根源
你之前踩了两个坑:一是搞混了Yarn的全局包目录和依赖缓存目录——要加速构建的是依赖缓存目录,不是全局包目录;二是打包缓存时的路径逻辑错了,导致压缩包为空。
正确的cloudbuild.yaml配置方案
1. 先恢复已有缓存(如果存在)
从存储桶拉取缓存包,解压到Yarn的真实缓存目录:
steps: # 拉取缓存包到临时目录 - name: 'gcr.io/cloud-builders/gsutil' args: ['cp', 'gs://你的存储桶名称/my-app-yarn-cache.tgz', '/tmp/yarn-cache.tgz'] id: 'pull-cache' waitFor: ['-'] # 独立执行,不等待其他步骤 # 解压缓存到Yarn指定的缓存目录 - name: 'gcr.io/cloud-builders/bash' args: - '-c' - | if [ -f /tmp/yarn-cache.tgz ]; then # 先创建缓存目录,避免找不到路径 mkdir -p $(yarn config get cacheFolder) # 解压时去掉顶层目录,直接把内容放到缓存目录里 tar -xzf /tmp/yarn-cache.tgz -C $(yarn config get cacheFolder) --strip-components=1 fi id: 'extract-cache' waitFor: ['pull-cache']
2. 安装项目依赖
此时Yarn会自动复用缓存,无需额外配置:
# 安装依赖,用--frozen-lockfile保证版本一致,缓存有效 - name: 'node:18' # 换成你项目用的Node版本 args: ['yarn', 'install', '--frozen-lockfile'] id: 'install-deps' waitFor: ['extract-cache']
3. 归档新缓存到存储桶
安装完成后,把最新的缓存目录内容打包上传:
# 打包缓存目录里的所有内容(注意是内容,不是目录本身) - name: 'gcr.io/cloud-builders/bash' args: - '-c' - | tar -czf /tmp/yarn-cache-new.tgz -C $(yarn config get cacheFolder) . id: 'package-cache' waitFor: ['install-deps'] # 上传新缓存到存储桶 - name: 'gcr.io/cloud-builders/gsutil' args: ['cp', '/tmp/yarn-cache-new.tgz', 'gs://你的存储桶名称/my-app-yarn-cache.tgz'] id: 'upload-cache' waitFor: ['package-cache']
关键注意事项
- 认准
cacheFolder:执行yarn config get cacheFolder能拿到真实的依赖缓存路径(默认是~/.cache/yarn),别再碰globalFolder——那是存全局安装包的,和项目依赖缓存无关。 - 打包路径要正确:用
-C $(yarn config get cacheFolder) .切换到缓存目录后打包内部内容,这样解压后不会多一层目录,Yarn能直接识别。 - 提前创建目录:用
mkdir -p确保缓存目录存在,彻底解决“找不到文件或目录”的报错。
验证方法
构建完成后,去存储桶下载my-app-yarn-cache.tgz解压,里面应该能看到各种依赖包的压缩文件和元数据。后续构建时,依赖安装步骤的耗时会明显缩短,说明缓存生效了。
内容的提问来源于stack exchange,提问作者Nate May
相关产品推荐
相关产品推荐

