From d3df46a43c7e322ed5f402e8b2a2f4e75a77d43e Mon Sep 17 00:00:00 2001 From: Masaki Yatsu Date: Sat, 13 Sep 2025 21:02:43 +0900 Subject: [PATCH] feat(k8s): deleting completed pods/jobs --- k8s/justfile | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/k8s/justfile b/k8s/justfile index 93b8973..63295e8 100644 --- a/k8s/justfile +++ b/k8s/justfile @@ -297,3 +297,79 @@ wait-deployments-ready *args: sleep 2 done echo "ok" + +# Delete completed pods across all namespaces +delete-completed-pods namespace='': + #!/bin/bash + set -euo pipefail + NAMESPACE="${NAMESPACE:-{{ namespace }}}" + + if [ -n "${NAMESPACE}" ]; then + echo "Deleting completed pods in namespace '${NAMESPACE}'..." + SELECTOR="--namespace=${NAMESPACE}" + else + echo "Deleting completed pods in all namespaces..." + SELECTOR="--all-namespaces" + fi + + # Find and delete pods with status.phase=Succeeded or status.phase=Failed + COMPLETED_PODS=$(kubectl get pods ${SELECTOR} -o json | \ + jq -r '.items[] | select(.status.phase == "Succeeded" or .status.phase == "Failed") | + .metadata.namespace + "/" + .metadata.name') + + if [ -z "${COMPLETED_PODS}" ]; then + echo "No completed pods found." + exit 0 + fi + + echo "Found completed pods:" + echo "${COMPLETED_PODS}" + echo "" + + if gum confirm "Delete these pods?"; then + echo "${COMPLETED_PODS}" | while IFS='/' read -r ns pod; do + echo "Deleting pod ${pod} in namespace ${ns}..." + kubectl delete pod "${pod}" -n "${ns}" --ignore-not-found + done + echo "Completed pods deleted." + else + echo "Deletion cancelled." + fi + +# Delete completed jobs across all namespaces +delete-completed-jobs namespace='': + #!/bin/bash + set -euo pipefail + NAMESPACE="${NAMESPACE:-{{ namespace }}}" + + if [ -n "${NAMESPACE}" ]; then + echo "Deleting completed jobs in namespace '${NAMESPACE}'..." + SELECTOR="--namespace=${NAMESPACE}" + else + echo "Deleting completed jobs in all namespaces..." + SELECTOR="--all-namespaces" + fi + + # Find and delete jobs with status.succeeded > 0 or status.failed > 0 + COMPLETED_JOBS=$(kubectl get jobs ${SELECTOR} -o json | \ + jq -r '.items[] | select((.status.succeeded // 0) > 0 or (.status.failed // 0) > 0) | + .metadata.namespace + "/" + .metadata.name') + + if [ -z "${COMPLETED_JOBS}" ]; then + echo "No completed jobs found." + exit 0 + fi + + echo "Found completed jobs:" + echo "${COMPLETED_JOBS}" + echo "" + + if gum confirm "Delete these jobs?"; then + echo "${COMPLETED_JOBS}" | while IFS='/' read -r ns job; do + echo "Deleting job ${job} in namespace ${ns}..." + kubectl delete job "${job}" -n "${ns}" --ignore-not-found --cascade=foreground + done + echo "Completed jobs deleted." + else + echo "Deletion cancelled." + fi