如何更新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步骤中列出的键的顺序恢复缓存。每个缓存键都被命名为项目,并且检索是前缀匹配的。将从第一个匹配密钥恢复缓存。如果存在多个匹配项,则将使用最近生成的缓存。[2]

想法诞生

既然在恢复的时候,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

参考资料


   转载规则


《如何更新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自动更新 什么是PWAPWA,即Progressive-Web-App,渐进式网络应用,概念有点类似于微信小程序,和MIUI的快应用,但是比他们更简
  目录