[api] Jenkinsfile.pjt

- 삭제정책 추가
This commit is contained in:
2026-02-04 15:47:04 +09:00
parent 0e8876e66f
commit 6722d774a7
+52 -52
View File
@@ -244,79 +244,79 @@ pipeline {
passwordVariable: 'DOCKER_PASS'
)]) {
sshagent(['ssh-pjt']) {
sh '''
set -e
sh '''#!/usr/bin/env bash
set -e
ssh -p ${SSH_PORT} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
${SSH_USER}@${SSH_HOST} \
"REGISTRY_HOST='${REGISTRY_HOST}' IMAGE_REPO='${IMAGE_REPO}' DOCKER_USER='${DOCKER_USER}' DOCKER_PASS='${DOCKER_PASS}' bash -se" <<'EOF'
set -e
ssh -p ${SSH_PORT} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
${SSH_USER}@${SSH_HOST} \
"REGISTRY_HOST='${REGISTRY_HOST}' IMAGE_REPO='${IMAGE_REPO}' DOCKER_USER='${DOCKER_USER}' DOCKER_PASS='${DOCKER_PASS}' bash -se" <<'REMOTE_EOF'
set -e
REGISTRY_URL="https://${REGISTRY_HOST}"
REPO="${IMAGE_REPO}"
KEEP=5
AUTH="${DOCKER_USER}:${DOCKER_PASS}"
REGISTRY_URL="https://${REGISTRY_HOST}"
REPO="${IMAGE_REPO}"
KEEP=5
AUTH="${DOCKER_USER}:${DOCKER_PASS}"
command -v jq >/dev/null 2>&1 || (sudo apt-get update -y && sudo apt-get install -y jq)
command -v jq >/dev/null 2>&1 || (sudo apt-get update -y && sudo apt-get install -y jq)
echo "[1/6] Debug URL"
echo "REGISTRY_URL=${REGISTRY_URL}"
echo "TAGS_URL=${REGISTRY_URL}/v2/${REPO}/tags/list"
echo "[1/6] Debug URL"
echo "TAGS_URL=${REGISTRY_URL}/v2/${REPO}/tags/list"
echo "[2/6] Collect running tags to protect"
RUNNING_TAGS=$(docker ps --format '{{.Image}}' | \
grep -E "^${REGISTRY_HOST}/${REPO}:" | \
awk -F: '{print $2}' | sort -u || true)
echo "[2/6] Collect running tags to protect"
RUNNING_TAGS=$(docker ps --format '{{.Image}}' | \
grep -E "^${REGISTRY_HOST}/${REPO}:" | \
awk -F: '{print $2}' | sort -u || true)
echo "[3/6] Fetch tags from registry"
TAGS=$(curl -fsS -u "${AUTH}" "${REGISTRY_URL}/v2/${REPO}/tags/list" | jq -r '.tags[]?' || true)
echo "[3/6] Fetch tags from registry"
TAGS=$(curl -fsS -u "${AUTH}" "${REGISTRY_URL}/v2/${REPO}/tags/list" | jq -r '.tags[]?' || true)
if [ -z "$TAGS" ]; then
echo "No tags found in registry. Skip."
exit 0
fi
if [ -z "$TAGS" ]; then
echo "No tags found in registry. Skip."
exit 0
fi
echo "[4/6] Sort tags desc"
SORTED=$(echo "$TAGS" | sort -r)
KEEP_TAGS=$(echo "$SORTED" | head -n $KEEP)
DEL_CANDIDATES=$(echo "$SORTED" | tail -n +$((KEEP+1)))
echo "[4/6] Sort tags desc"
SORTED=$(echo "$TAGS" | sort -r)
KEEP_TAGS=$(echo "$SORTED" | head -n $KEEP)
DEL_CANDIDATES=$(echo "$SORTED" | tail -n +$((KEEP+1)))
echo "Keep tags:"
echo "$KEEP_TAGS" | sed 's/^/ - /'
echo "Keep tags:"
echo "$KEEP_TAGS" | sed 's/^/ - /'
echo "[5/6] Delete old tags except running tags"
for TAG in $DEL_CANDIDATES; do
if [ -n "$RUNNING_TAGS" ] && echo "$RUNNING_TAGS" | grep -qx "$TAG"; then
echo "Skip running tag: ${REPO}:${TAG}"
continue
fi
echo "[5/6] Delete old tags except running tags"
for TAG in $DEL_CANDIDATES; do
if [ -n "$RUNNING_TAGS" ] && echo "$RUNNING_TAGS" | grep -qx "$TAG"; then
echo "Skip running tag: ${REPO}:${TAG}"
continue
fi
echo "Deleting ${REPO}:${TAG}"
echo "Deleting ${REPO}:${TAG}"
DIGEST=$(curl -fsSI -u "${AUTH}" \
-H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
"${REGISTRY_URL}/v2/${REPO}/manifests/${TAG}" \
| awk -F': ' '/Docker-Content-Digest/ {print $2}' | tr -d '\r')
DIGEST=$(curl -fsSI -u "${AUTH}" \
-H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
"${REGISTRY_URL}/v2/${REPO}/manifests/${TAG}" \
| awk -F': ' '/Docker-Content-Digest/ {print $2}' | tr -d '\r')
if [ -z "$DIGEST" ]; then
echo " digest not found. skip ${TAG}"
continue
fi
if [ -z "$DIGEST" ]; then
echo " digest not found. skip ${TAG}"
continue
fi
curl -fsS -u "${AUTH}" -X DELETE "${REGISTRY_URL}/v2/${REPO}/manifests/${DIGEST}" || true
done
curl -fsS -u "${AUTH}" -X DELETE "${REGISTRY_URL}/v2/${REPO}/manifests/${DIGEST}" || true
done
echo "[6/6] Garbage collect (reclaim disk)"
docker exec registry registry garbage-collect /etc/docker/registry/config.yml
echo "[6/6] Garbage collect (reclaim disk)"
docker exec registry registry garbage-collect /etc/docker/registry/config.yml
echo "Registry cleanup done."
EOF
'''
echo "Registry cleanup done."
REMOTE_EOF
'''
}
}
}
}
}
}