Files
Jyotisha/deploy/reclaim-runner-disk.sh
T
Jesse_Chen 5687182980
Independent Staging Quality Gate / validate (push) Successful in 9m24s
Independent Staging Quality Gate / publish (push) Successful in 7m24s
ci(runner): move every Gitea job to xiaoxin and let the gate reclaim its own disk
质量门跑在以 :host 模式注册的跳板机上,与无关生产服务共用文件系统,累积的按
SHA 打标镜像把根分区占满,PostgreSQL fixture 起不来,staging 连续 5 个提交发不
出去。把 12 个 job 统一迁到 xiaoxin,并在开跑前回收磁盘、余量不足时直接报磁盘
原因而不是让 23 个数据库测试代为失败。

当年据以搬迁的「xiaoxin 缺少 Docker Compose v2」是误诊:真实原因是用户级插件
目录里一个零字节 docker-compose 遮蔽了系统插件。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-18 10:12:55 +08:00

57 lines
1.9 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
MINIMUM_FREE_GIB="${MINIMUM_FREE_GIB:-10}"
IMAGE_REPOSITORY="${IMAGE_REPOSITORY:-*/copse/jyotisha}"
KEEP_IMAGE_SHA="${KEEP_IMAGE_SHA:-}"
if ! [[ "$MINIMUM_FREE_GIB" =~ ^[0-9]+$ ]]; then
echo "MINIMUM_FREE_GIB must be a whole number of GiB" >&2
exit 1
fi
DOCKER_ROOT="$(docker info --format '{{.DockerRootDir}}')"
if [ -z "$DOCKER_ROOT" ] || [ ! -d "$DOCKER_ROOT" ]; then
echo "unable to resolve the Docker root directory to measure" >&2
exit 1
fi
free_gib() {
df -Pk "$DOCKER_ROOT" | awk 'NR == 2 { printf "%d", $4 / 1048576 }'
}
BEFORE_GIB="$(free_gib)"
echo "docker root $DOCKER_ROOT has ${BEFORE_GIB} GiB free before reclaim"
# Every reclaim below is restricted to resources no container currently holds,
# so a quality-gate job running concurrently on this runner keeps its fixtures.
docker container prune --force --filter until=6h
docker volume ls --quiet --filter 'name=^jyotisha-postgres-' --filter dangling=true |
xargs -r docker volume rm
docker network prune --force --filter until=6h
docker image prune --force
# Exact-SHA release images are immutable in the registry once published, so the
# runner's local copies are rebuildable cache rather than release state.
KEEP_TAG_SHA="${KEEP_IMAGE_SHA:-no-image-to-keep}"
STALE_IMAGES="$(docker image ls --format '{{.Repository}}:{{.Tag}}' \
--filter "reference=$IMAGE_REPOSITORY:api-*" \
--filter "reference=$IMAGE_REPOSITORY:web-*" |
grep -v -F -e "api-$KEEP_TAG_SHA" -e "web-$KEEP_TAG_SHA" || true)"
if [ -n "$STALE_IMAGES" ]; then
printf '%s\n' "$STALE_IMAGES" | xargs -r docker image rm || true
fi
docker builder prune --force --all
AFTER_GIB="$(free_gib)"
echo "docker root $DOCKER_ROOT has ${AFTER_GIB} GiB free after reclaim"
docker system df
if [ "$AFTER_GIB" -lt "$MINIMUM_FREE_GIB" ]; then
echo "runner kept only ${AFTER_GIB} GiB free; PostgreSQL fixtures and image builds need at least ${MINIMUM_FREE_GIB} GiB" >&2
exit 1
fi
echo "runner disk reclaimed"