github actions 中自动清理需设为必执行收尾环节,用 if: always() 保证失败时仍运行;按资源分层清理临时文件、docker、k8s 和 artifacts;加 echo 预览、--dry-run 试跑、环境判断等安全防护;辅以定时任务清理旧镜像、标签和分支。

GitHub Actions 实现构建后的自动清理,关键不是“等构建完再手动加一步”,而是把清理设计成工作流中必走、必生效的收尾环节——尤其要确保测试失败时也不跳过清理。
用 if: always() 保证清理不被跳过
默认情况下,某个步骤失败后,后续步骤会被跳过。但清理必须执行,否则临时文件、容器、数据库残留会污染下一次运行。
- 在清理步骤前明确写
if: always() - 不要依赖上一步的 success 状态,哪怕 pytest 报错、构建中断,清理仍会触发
- 示例:
- name: Cleanup temporary files<br> if: always()<br> run: rm -rf test.db coverage/ *.log
按资源类型分层清理
不同构建产物需要不同清理方式,混在一起容易遗漏或误删。
-
临时文件与构建产物:日志、覆盖率报告、SQLite 文件、生成的 mock 数据库等,直接
rm -rf即可 -
Docker 资源:用
docker container prune -f清僵尸容器;搭配--filter "until=24h"避免删掉还在用的镜像 -
Kubernetes 测试资源:在 job 结束前执行
kubectl delete -f ./test-manifests/或按 label 删除:kubectl delete all -l ci=test-run -
GitHub Artifacts:用
gha-remove-artifacts按时间(如“30天前”)或数量(如“只留最近5个”)清理
清理前加安全防护
自动化清理威力大,但也意味着风险高。几条实用防护建议:
- 所有清理命令先加
echo或ls预览目标,确认路径/标签无误再执行真实操作 - 对 Docker 镜像、GCR 或 Artifact Registry 清理,优先用
--dry-run参数试跑一次 - 敏感操作(如删分支、删标签)加上环境判断,例如只在
main或ci/*分支上运行 - 用
actions/checkout@v4时,避免fetch-depth: 0导致本地 Git 引用爆炸;必要时用tryConfigUnsetAll重置检出状态
定时+事件双触发,兼顾主动与被动
单靠每次构建后清理还不够,有些资源(如旧镜像、历史标签)需定期归档或删除。
- 对 Docker Hub / GCR 镜像:用 cron 触发每周清理,配合
gcr-cleaner的-keep=3和-grace=72h参数,保最新、删陈旧 - 对 GitHub 标签:用
label-squeeze自动识别并删除ci-、pr-类临时标签 - 对分支:用
branch-cleanup-action在 PR 关闭后立即删源分支,避免堆积











