Add rollout wait step to Drone CI pipelines

Both frontend and API pipelines now wait for K8s deployments to fully
roll out before marking the build as successful. Polls the K8s API
every 5s for up to 300s, checking observedGeneration, updatedReplicas,
and readyReplicas to confirm the new image is live in production.
This commit is contained in:
Viktor Barzin 2026-02-08 20:28:02 +00:00
parent 5b566bab4c
commit 6a1c35946e
No known key found for this signature in database
GPG key ID: 0EB088298288D958

View file

@ -33,6 +33,34 @@ steps:
- apk add curl - apk add curl
- 'curl -s -X PATCH "https://kubernetes:6443/apis/apps/v1/namespaces/realestate-crawler/deployments/realestate-crawler-ui" -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" -H "Content-Type: application/json-patch+json" -k -d ''[{"op":"replace","path":"/spec/template/spec/containers/0/image","value":"viktorbarzin/immoweb:''"$DRONE_BUILD_NUMBER"''"}]'' | head' - 'curl -s -X PATCH "https://kubernetes:6443/apis/apps/v1/namespaces/realestate-crawler/deployments/realestate-crawler-ui" -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" -H "Content-Type: application/json-patch+json" -k -d ''[{"op":"replace","path":"/spec/template/spec/containers/0/image","value":"viktorbarzin/immoweb:''"$DRONE_BUILD_NUMBER"''"}]'' | head'
- name: Wait for rollout
image: alpine
commands:
- apk add --no-cache curl jq
- >-
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token);
API="https://kubernetes:6443/apis/apps/v1/namespaces/realestate-crawler/deployments";
for DEPLOY in realestate-crawler-ui; do
echo "Waiting for $DEPLOY rollout...";
for i in $(seq 1 60); do
S=$(curl -sk -H "Authorization: Bearer $TOKEN" "$API/$DEPLOY");
DESIRED=$(echo "$S" | jq '.spec.replicas');
UPDATED=$(echo "$S" | jq '.status.updatedReplicas // 0');
READY=$(echo "$S" | jq '.status.readyReplicas // 0');
GEN=$(echo "$S" | jq '.metadata.generation');
OBS=$(echo "$S" | jq '.status.observedGeneration // 0');
if [ "$OBS" -ge "$GEN" ] && [ "$UPDATED" -eq "$DESIRED" ] && [ "$READY" -eq "$DESIRED" ]; then
echo "$DEPLOY rollout complete ($READY/$DESIRED ready)";
break;
fi;
echo " $DEPLOY: $READY/$DESIRED ready, $UPDATED updated (attempt $i/60)";
sleep 5;
done;
if [ "$i" -eq 60 ] && { [ "$READY" -ne "$DESIRED" ] || [ "$UPDATED" -ne "$DESIRED" ]; }; then
echo "ERROR: $DEPLOY rollout timed out after 300s"; exit 1;
fi;
done
--- ---
kind: pipeline kind: pipeline
type: kubernetes type: kubernetes
@ -71,3 +99,31 @@ steps:
- 'curl -s -X PATCH "https://kubernetes:6443/apis/apps/v1/namespaces/realestate-crawler/deployments/realestate-crawler-api" -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" -H "Content-Type: application/json-patch+json" -k -d ''[{"op":"replace","path":"/spec/template/spec/containers/0/image","value":"viktorbarzin/realestatecrawler:''"$DRONE_BUILD_NUMBER"''"}]'' | head' - 'curl -s -X PATCH "https://kubernetes:6443/apis/apps/v1/namespaces/realestate-crawler/deployments/realestate-crawler-api" -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" -H "Content-Type: application/json-patch+json" -k -d ''[{"op":"replace","path":"/spec/template/spec/containers/0/image","value":"viktorbarzin/realestatecrawler:''"$DRONE_BUILD_NUMBER"''"}]'' | head'
- 'curl -s -X PATCH "https://kubernetes:6443/apis/apps/v1/namespaces/realestate-crawler/deployments/realestate-crawler-celery" -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" -H "Content-Type: application/json-patch+json" -k -d ''[{"op":"replace","path":"/spec/template/spec/containers/0/image","value":"viktorbarzin/realestatecrawler:''"$DRONE_BUILD_NUMBER"''"}]'' | head' - 'curl -s -X PATCH "https://kubernetes:6443/apis/apps/v1/namespaces/realestate-crawler/deployments/realestate-crawler-celery" -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" -H "Content-Type: application/json-patch+json" -k -d ''[{"op":"replace","path":"/spec/template/spec/containers/0/image","value":"viktorbarzin/realestatecrawler:''"$DRONE_BUILD_NUMBER"''"}]'' | head'
- 'curl -s -X PATCH "https://kubernetes:6443/apis/apps/v1/namespaces/realestate-crawler/deployments/realestate-crawler-celery-beat" -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" -H "Content-Type: application/json-patch+json" -k -d ''[{"op":"replace","path":"/spec/template/spec/containers/0/image","value":"viktorbarzin/realestatecrawler:''"$DRONE_BUILD_NUMBER"''"}]'' | head' - 'curl -s -X PATCH "https://kubernetes:6443/apis/apps/v1/namespaces/realestate-crawler/deployments/realestate-crawler-celery-beat" -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" -H "Content-Type: application/json-patch+json" -k -d ''[{"op":"replace","path":"/spec/template/spec/containers/0/image","value":"viktorbarzin/realestatecrawler:''"$DRONE_BUILD_NUMBER"''"}]'' | head'
- name: Wait for rollout
image: alpine
commands:
- apk add --no-cache curl jq
- >-
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token);
API="https://kubernetes:6443/apis/apps/v1/namespaces/realestate-crawler/deployments";
for DEPLOY in realestate-crawler-api realestate-crawler-celery realestate-crawler-celery-beat; do
echo "Waiting for $DEPLOY rollout...";
for i in $(seq 1 60); do
S=$(curl -sk -H "Authorization: Bearer $TOKEN" "$API/$DEPLOY");
DESIRED=$(echo "$S" | jq '.spec.replicas');
UPDATED=$(echo "$S" | jq '.status.updatedReplicas // 0');
READY=$(echo "$S" | jq '.status.readyReplicas // 0');
GEN=$(echo "$S" | jq '.metadata.generation');
OBS=$(echo "$S" | jq '.status.observedGeneration // 0');
if [ "$OBS" -ge "$GEN" ] && [ "$UPDATED" -eq "$DESIRED" ] && [ "$READY" -eq "$DESIRED" ]; then
echo "$DEPLOY rollout complete ($READY/$DESIRED ready)";
break;
fi;
echo " $DEPLOY: $READY/$DESIRED ready, $UPDATED updated (attempt $i/60)";
sleep 5;
done;
if [ "$i" -eq 60 ] && { [ "$READY" -ne "$DESIRED" ] || [ "$UPDATED" -ne "$DESIRED" ]; }; then
echo "ERROR: $DEPLOY rollout timed out after 300s"; exit 1;
fi;
done