From 0ec486f13239c0717236c0eed2aa697170492b24 Mon Sep 17 00:00:00 2001 From: hz Date: Thu, 23 Jul 2026 17:03:02 -0500 Subject: [PATCH] Stabilize UAT API pod selection --- .gitea/scripts/deploy-environment.sh | 32 +++++++++++++++++++++------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/.gitea/scripts/deploy-environment.sh b/.gitea/scripts/deploy-environment.sh index 3471792..86ddd43 100644 --- a/.gitea/scripts/deploy-environment.sh +++ b/.gitea/scripts/deploy-environment.sh @@ -72,16 +72,32 @@ kubectl rollout status deployment/step3-api -n "${KUBE_NAMESPACE}" --timeout=240 kubectl get --raw "/api/v1/namespaces/${KUBE_NAMESPACE}/services/step3-api:http/proxy/readyz" >/dev/null if [ "${DEPLOYMENT_ENVIRONMENT}" = "uat" ]; then - API_POD="$(kubectl get pods -n "${KUBE_NAMESPACE}" -l app=step3-api \ - --field-selector=status.phase=Running -o jsonpath='{.items[0].metadata.name}')" - if [ -z "${API_POD}" ]; then - echo "No running API pod is available for dynamic question promotion." >&2 + # A completed old replica can briefly remain visible immediately after a + # rollout. Select the newest pod that is both Running and container-ready + # instead of relying on the first item returned by Kubernetes. + PROMOTION_SUCCEEDED=0 + for attempt in 1 2 3; do + API_POD="$(kubectl get pods -n "${KUBE_NAMESPACE}" -l app=step3-api \ + --field-selector=status.phase=Running \ + --sort-by=.metadata.creationTimestamp \ + -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.containerStatuses[0].ready}{"\n"}{end}' \ + | awk '$2 == "true" { name = $1 } END { print name }')" + if [ -n "${API_POD}" ] \ + && kubectl wait -n "${KUBE_NAMESPACE}" --for=condition=Ready "pod/${API_POD}" --timeout=60s \ + && kubectl exec -n "${KUBE_NAMESPACE}" "${API_POD}" -- \ + dotnet QuestionsApi.dll promote-dynamic-questions \ + --source /app/content/dynamic_questions \ + --apply; then + PROMOTION_SUCCEEDED=1 + break + fi + echo "Dynamic question promotion attempt ${attempt} did not find a stable ready API pod; retrying." >&2 + sleep 2 + done + if [ "${PROMOTION_SUCCEEDED}" -ne 1 ]; then + echo "Dynamic question promotion failed after 3 attempts." >&2 exit 1 fi - kubectl exec -n "${KUBE_NAMESPACE}" "${API_POD}" -- \ - dotnet QuestionsApi.dll promote-dynamic-questions \ - --source /app/content/dynamic_questions \ - --apply fi kubectl rollout status deployment/step3-web -n "${KUBE_NAMESPACE}" --timeout=240s