在备份 gitlab 时发现备份 artifacts 竟然耗时近18分钟
2026-10-31 13:07:50 +0800 -- Dumping artifacts ...
2026-10-31 13:25:12 +0800 -- Dumping artifacts ... done
请问如何删除 GitLab 中所有项目的 artifacts?
from copilot GPT-6 Astra:
自建 GitLab、有服务器管理权限时,建议通过 Rails 控制台批量清理,不要直接删除 artifacts 目录或数据库记录。
⚠️ 此操作不可恢复,会删除所有项目的 Job artifacts,包括构建产物、报告,以及被保留的最新流水线产物。
保留代码仓库、流水线记录和 Job 日志。
执行前请做好备份,暂停新流水线,并等待运行中的任务结束。
在 GitLab 服务器执行:
sudo gitlab-rails console
假设容器名为 gitlab,请按实际名称替换:
docker exec -it gitlab gitlab-rails console
以下使用当前 GitLab 的内部接口;旧版本应先核对对应版本文档,不要直接照搬。
在 Rails 控制台执行,查看待删除的 artifact 记录数,不包含 Job 日志:
Ci::JobArtifact.erasable.count
确认备份和删除范围后,在 Rails 控制台执行:
Ci::Build.with_erasable_artifacts.each_batch(of: 100) do |batch|
batch.each do |build|
result = Ci::JobArtifacts::DeleteService.new(build).execute
raise "Job #{build.id}: #{result.message}" if result.error?
puts "已清理 Job #{build.id}"
end
end
此操作不限制创建时间,也覆盖只有报告、没有普通压缩包的任务。
如执行中途报错,应先排查原因;此前已成功删除的 artifacts 不会自动恢复。
Ci::JobArtifact.erasable.count
没有新任务写入的情况下,应为 0。
退出控制台:
exit
较新版本会交给后台任务删除实际文件,需确保 Sidekiq 正常运行。大量文件的物理清理可能耗时很久。
记录数归零,不代表磁盘上的文件已经全部清理完毕。
DELETE /projects/:id/artifacts
此接口默认会保留部分最新流水线的 artifacts,不能仅遍历项目调用它就认定全部删完。
在管理员的 CI/CD 设置中:
默认过期时间的修改只影响新产物,不会自动修改已有产物的过期时间。