Skip to content

自动清理

Shipfe 提供可配置的自动清理旧发布和未使用共享资源功能。

配置选项

keep_releases(推荐)

json
{
  "keep_releases": 5,
  "delete_old": false
}
  • 保留最近的 5 个发布
  • 自动删除旧发布
  • 与共享资源清理配合工作

delete_old(传统)

json
{
  "delete_old": true
}
  • 在每次部署后删除所有旧发布
  • 只保留当前部署
  • 覆盖 keep_releases 设置

清理过程

发布清理

  1. 按修改时间排序发布(最新优先)
  2. 保留指定数量的最近发布
  3. 完全删除旧发布目录

共享资源清理(当 enable_shared: true 时)

  1. 扫描所有剩余发布快照
  2. 收集当前被引用的所有哈希资源
  3. shared/assets/ 删除未引用的文件

清理行为示例

清理前(7 个发布)

releases/
├── 20260301_100000/  (最旧)
├── 20260302_100000/
├── 20260303_100000/
├── 20260304_100000/
├── 20260305_100000/
├── 20260306_100000/
└── 20260307_100000/  (最新,当前)

清理后(keep_releases: 3

releases/
├── 20260305_100000/  (保留)
├── 20260306_100000/  (保留)
└── 20260307_100000/  (保留,当前)

旧发布自动删除

监控清理

bash
# 检查当前发布
ls -la releases/

# 在 shipfe.log 中查看清理日志
tail -f shipfe.log | grep -i "cleanup\|remove"

手动清理

强制清理

bash
# 重新部署会触发清理
shipfe deploy

自定义清理脚本

bash
#!/bin/bash
# 自定义清理脚本示例

DEPLOY_PATH="/var/www/myapp"
KEEP_RELEASES=5

# 进入发布目录
cd "$DEPLOY_PATH/releases"

# 获取要删除的旧发布
OLD_RELEASES=$(ls -t | tail -n +$((KEEP_RELEASES + 1)))

# 删除旧发布
for release in $OLD_RELEASES; do
  echo "Removing old release: $release"
  rm -rf "$release"
done

清理策略选择

滚动发布策略

json
{
  "keep_releases": 5,
  "delete_old": false
}

适用场景

  • 需要频繁回滚
  • 存储空间充足
  • 重视部署历史

最小化策略

json
{
  "delete_old": true
}

适用场景

  • 存储空间有限
  • 部署频繁
  • 不需要历史版本

共享资源清理

当启用共享资源时,清理过程更复杂:

  1. 扫描快照:检查所有保留发布的快照文件
  2. 收集引用:汇总所有仍在使用的共享资源哈希
  3. 安全删除:只删除完全未引用的共享文件

示例清理过程

保留发布:v1, v2, v3
v1 使用的共享资源:a.js, b.css
v2 使用的共享资源:a.js, c.png
v3 使用的共享资源:b.css, d.svg

仍在使用的资源:a.js, b.css, c.png, d.svg
可删除的资源:(无)

结果:所有共享资源都被保留

性能影响

磁盘I/O

  • 清理操作主要涉及文件删除
  • 对运行中的应用无影响
  • 可以在低峰期执行

存储优化

  • 自动释放磁盘空间
  • 防止日志和临时文件积累
  • 维持健康的存储使用率

安全考虑

数据保护

  • 清理前验证快照完整性
  • 只删除确认未使用的文件
  • 保留最近的多个版本作为安全网

权限检查

  • 验证删除权限
  • 避免删除系统文件
  • 记录所有清理操作

故障排除

清理失败

Warning: Failed to remove old release

可能原因

  • 文件被进程锁定
  • 权限不足
  • 文件系统问题

解决方案

  • 检查文件锁定:lsof +D /path/to/release
  • 修复权限:chmod -R 755 /var/www/myapp
  • 手动清理:rm -rf /path/to/old/release

共享资源清理问题

Warning: Failed to cleanup shared assets

可能原因

  • 快照文件损坏
  • 硬链接引用错误
  • 权限问题

解决方案

  • 验证快照文件
  • 检查硬链接:ls -la shared/assets/
  • 重新生成共享资源

磁盘空间不足

如果清理无法释放足够空间:

  • 检查大文件:du -sh releases/*
  • 手动删除旧版本
  • 增加 keep_releases 的值
  • 考虑迁移到更大磁盘

最佳实践

  1. 监控存储使用:定期检查磁盘使用情况
  2. 设置合理保留数量:根据部署频率调整 keep_releases
  3. 备份重要版本:对关键版本进行额外备份
  4. 日志监控:监控清理操作的日志
  5. 定期审核:检查清理策略是否仍然合适