4. 升级前缓存快照备份:备份工具、备份范围、备份命名规范

适用场景

在 AGP 版本升级前,必须对当前构建缓存状态进行完整快照备份,以便在升级出现兼容性故障或构建回滚时能够快速恢复缓存,避免全量重新下载和编译。本 SOP 适用于以下具体场景:

  • AGP 主版本升级(如 7.x → 8.x)前
  • AGP 次版本或补丁版本升级(如 8.1 → 8.2)前,且构建系统较为复杂或存在自研 Gradle 插件
  • Gradle 版本与 AGP 版本同时升级前
  • 需要将现有构建环境迁移至新开发机或 CI 节点前

前置条件

  • 当前 AGP 构建环境已稳定运行至少一个完整构建周期,缓存目录完整
  • 备份目标存储位置有足够磁盘空间(建议至少保留当前缓存总大小的 1.2 倍)
  • 已确认缓存目录路径(默认 ~/.gradle/caches/,可通过 gradle --info build 日志确认实际路径)
  • 备份工具已就绪:Linux/macOS 可使用 tar、gzip、rsync;Windows 推荐使用 7-Zip 或 PowerShell Compress-Archive
  • 当前正在进行的构建任务已全部完成,避免备份时出现文件锁定或写入不一致

操作步骤

  1. 确认缓存目录结构
    执行命令列出缓存根目录下的一级子目录,确认构建缓存、依赖缓存、转换缓存等关键子目录均存在且非空。
    ls -la ~/.gradle/caches/
    # 预期输出包含 modules-2, transforms-2, buildsnoop, jar-snapshots 等子目录
  2. 执行备份命令
    根据操作系统选择合适的打包工具。以下为 Linux/macOS 示例,将整个缓存目录打包为压缩归档:
    BACKUP_NAME="cache-backup-$(date +%Y%m%d-%H%M%S)-AGP-$(agp_version).tar.gz"
    tar -czf /path/to/backup/$BACKUP_NAME -C ~/.gradle caches/
    若磁盘空间紧张,可排除 caches/modules-2/files-2.1/ 中的大型远程依赖包(可重新下载),仅备份构建缓存和转换缓存:
    tar -czf /path/to/backup/$BACKUP_NAME \
      --exclude='caches/modules-2/files-2.1' \
      -C ~/.gradle caches/
  3. 生成校验文件
    计算备份文件的 SHA-256 摘要,用于后续完整性校验:
    sha256sum /path/to/backup/$BACKUP_NAME > /path/to/backup/$BACKUP_NAME.sha256
  4. 记录备份元信息
    在备份同目录下创建一个 manifest.json 文件,记录备份时间、AGP 版本、Gradle 版本、缓存大小、排除项等。
    {
      "backup_time": "2025-02-18 14:30:00",
      "agp_version": "8.1.0",
      "gradle_version": "8.4",
      "origin_cache_dir": "/home/jenkins/.gradle/caches",
      "total_cache_size_mb": 2456,
      "excluded_dirs": ["modules-2/files-2.1"],
      "tool": "tar+gzip+sha256",
      "backup_file": "cache-backup-20250218-143000-AGP-8.1.0.tar.gz",
      "checksum": "a1b2c3d4e5..."
    }
  5. 移动备份至安全存储
    将备份归档、SHA256 文件和 manifest.json 一同移至专用备份服务器或对象存储(如 S3/MinIO)。保留本地副本至少 7 天。

输入输出物

类型内容格式/路径
输入当前 Gradle 缓存目录~/.gradle/caches/
输入AGP 版本号(用于命名)从 build.gradle 或 gradle.properties 获取
输入备份工具与目标存储路径由团队基础设施决定
输出压缩的缓存快照文件cache-backup-{datetime}-AGP-{version}.tar.gz
输出SHA-256 校验文件{backup_file}.sha256
输出备份元信息清单manifest.json

责任边界

  • 构建管理员 / CI 运维:负责制定备份策略、编写备份脚本、验证备份可用性;在升级前执行快照备份。
  • 开发团队:触发升级前通知运维,确认当前构建环境无异常;配合执行备份验证(如随机恢复一个构建场景)。
  • 质量保证:验收备份文件的完整性,确认备份范围覆盖核心缓存。

记录材料

  • 备份日志文件(backup-YYYYMMDD-HHMMSS.log):包含备份命令执行输出、打包耗时、文件大小。
  • 备份清单(manifest.json):记录版本、时间、路径、校验和、排除策略。
  • 备份存储目录结构截图(可选):用于快速确认备份文件位置。

异常处理

异常场景处理措施
磁盘空间不足清理目标存储的旧备份(保留最近 3 次),或使用 rsync 直接同步到远端而非本地打包。
缓存目录被进程锁定使用 lsof 或 fuser 找出占用进程,暂停非关键 Gradle 守护进程后重试。
备份文件校验失败删除损坏的备份归档,重新执行备份命令;检查磁盘 I/O 错误或内存不足。
AGP 版本号获取失败手动填写备份文件名中的版本字段,并在 manifest 中标记 version_source: "manual"。
备份超时(大型缓存 > 10GB)使用 nice -n 19 降低优先级,或分卷打包(如 split 分割 tar 包)。

验收标准

  1. 备份文件大小与缓存目录实际占用偏差不超过 5%(排除的目录需在 manifest 中注明)。
  2. SHA-256 校验通过:sha256sum -c {backup_file}.sha256 输出 OK。
  3. 随机抽取备份中的部分缓存文件(如 transforms-2/ 下的某个 jar),使用 tar -tzf 确认文件可正常列出,解压后内容无损坏。
  4. 备份命名遵循规范 cache-backup-YYYYMMDD-HHMMSS-AGP-{version}.tar.gz,且对应 manifest 存在。
  5. 备份已上传至指定安全存储,本地副本保留策略生效。
缓存快照备份流程结构 缓存快照备份流程结构 备份快照 备份工具 Linux: tar/gzip macOS: tar/gzip Windows: 7-Zip / Compress-Archive 备份范围 构建缓存 (build-cache) 转换缓存 (transforms-2) 可选排除: 依赖缓存 命名规范 前缀: cache-backup- 时间: YYYYMMDD-HHMMSS 后缀: -AGP-{version}.tar.gz 校验机制 SHA-256 校验文件 文件: {backup}.sha256 存储位置 本地 + 远端对象存储 (S3/MinIO) 说明:备份快照应包含构建缓存、转换缓存等核心数据,依赖缓存可根据网络条件选择排除。 命名规范确保可通过文件名快速识别备份时间与 AGP 版本;SHA-256 校验用于升级后恢复前的完整性验证。 存储位置建议同时保留本地副本(7 天)和远端冷存储(30 天),以应对不同回滚需求。