如何更新CircleCI的缓存

前言

众所周知,CircleCI的缓存是不可变的(immutable),如果不跟后缀保存缓存的话,会报错如下:

Skipping cache generation, cache already exists for key

如何解决这样的错误,也就是如何更新现有的缓存,是一个急需解决的问题。

现状

CircleCI cache 过程

在初始构建运行之后,有了缓存,未来的构建将运行得更快。

common case

steps:
- restore_cache:
keys:
- m2-{{ checksum "pom.xml" }}
- m2- # used if checksum fails

CircleCI按照restore_cache步骤中列出的键的顺序恢复缓存。每个缓存键都被命名为项目,并且检索是前缀匹配的。将从第一个匹配密钥恢复缓存。如果存在多个匹配项,则将使用最近生成的缓存。[1]

想法诞生

既然在恢复的时候,CircleCI有多个匹配项fallback机制,那我们只要在保存的时候用一些标识符区分开就行,恢复的时候,会fallback到不带后缀的缓存名的那个缓存。

简单来说就是:

这样保存

- save_cache:
paths:
- img-cache
key: my-img-cache-{{ epoch }}

这样恢复

- restore_cache:
keys:
- my-img-cache

它会直接恢复上一次保存的那个带后缀的版本。

其他可用后缀

模板 描述
{{ .Branch }} 正在构建中的VCS分支名
{{ .BuildNum }} 此构建的CircleCI作业编号
{{ .Revision }} 目前正在构建VCS修订版本号
{{ .Environment.variableName }} 环境变量variableName
{{ checksum "filename" }} 给定文件名内容的base64编码SHA256哈希,考虑使用依赖性清单,例如package-lock.jsonpom.xmlproject.clj
{{ epoch }} 自00:00:00 UTC 以来经过的秒数
{{ arch }} OS和CPU信息

构建截图

恢复缓存

保存缓存

完整示例

# Javascript Node CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-javascript/ for more details
#
version: 2
jobs:
build:
docker:
- image: circleci/node:10.13.0

working_directory: ~/repo

steps:
- checkout

# Download and cache dependencies
- restore_cache:
keys:
- v1-dependencies-{{ checksum "package.json" }}
# fallback to using the latest cache if no exact match is found
- v1-dependencies-

- run: sudo npm install hexo-cli -g
- run: npm install

- save_cache:
paths:
- node_modules
key: v1-dependencies-{{ checksum "package.json" }}

- add_ssh_keys:
fingerprints:
- "87:76:25422665541556691f:8a"

# deploy to github page
- run: git config --global user.email "har123156com"
- run: git config --global user.name "Ha456566leCI"

# 恢复图片缓存
- restore_cache:
keys:
- my-img-cache
- run: hexo g
# 保存图片缓存
- save_cache:
paths:
- img-cache
key: my-img-cache-{{ epoch }}

- run: hexo d

参考资料


  1. caching dependencies https://circleci.com/docs/2.0/caching/ ↩︎


   转载规则


《如何更新CircleCI的缓存》 Harbor Zeng 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
TWA踩坑记-从零到一让你的博客变成app并上架商店 TWA踩坑记-从零到一让你的博客变成app并上架商店
前言 在上一篇文章 PWA踩坑记-从零到一让你的博客也能离线访问 中,我介绍了如何将您的博客升级为PWA (Progressive-Web-App) 应用。 在这篇文章里,我将向您一步一步展示如何使您现有的PWA转化为TWA 您将学到: 什么是TWA? 什么是activity? TWA特性 安卓开发基础环境搭建 Gradle的基本概念 TWA与网站的双向验证方法 Android软件签名 如何自
下一篇 
PWA踩坑记-从零到一让你的博客也能离线访问 PWA踩坑记-从零到一让你的博客也能离线访问
前言 这篇文章所采用的chrome浏览器版本为72,如有疑虑,请留言讨论,谢谢。 您将在这篇文章中学习到: 什么是PWA PWA的工作原理 如何给自己的hexo静态博客实现PWA Service worker生命周期 Service worker自动更新 什么是PWA PWA,即Progressive-Web-App,渐进式网络应用,概念有点类似于微信小程序,和MIUI的快应用,但是比
  目录