wrongmove/.drone.yml
Viktor Barzin 6a1c35946e
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.
2026-02-08 20:28:02 +00:00

129 lines
5.4 KiB
YAML

kind: pipeline
type: kubernetes
name: frontend
concurrency:
limit: 1
timeout: 20
trigger:
branch:
- master
event:
- push
steps:
- name: Build frontend image
image: plugins/docker
settings:
username: viktorbarzin
password:
from_secret: dockerhub-token
repo: viktorbarzin/immoweb
dockerfile: frontend/Dockerfile
context: frontend
tags:
- latest
- ${DRONE_BUILD_NUMBER}
- name: Update deployment
image: alpine
commands:
- 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'
- 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
type: kubernetes
name: api
concurrency:
limit: 1
timeout: 20
trigger:
branch:
- master
event:
- push
steps:
- name: Build API image
image: plugins/docker
settings:
username: viktorbarzin
password:
from_secret: dockerhub-token
repo: viktorbarzin/realestatecrawler
dockerfile: Dockerfile
context: .
tags:
- latest
- ${DRONE_BUILD_NUMBER}
cache_from: viktorbarzin/realestatecrawler:latest
- name: Update deployment
image: alpine
commands:
- apk add curl
- '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-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