BCards/scripts/swarm_deploy.sh
Ricardo Carneiro 3f4fed08d5
All checks were successful
BCards Deployment Pipeline / Run Tests (push) Successful in 2s
BCards Deployment Pipeline / PR Validation (push) Has been skipped
BCards Deployment Pipeline / Build and Push Image (push) Successful in 14m32s
BCards Deployment Pipeline / Deploy to Production (ARM - OCI) (push) Successful in 1m33s
BCards Deployment Pipeline / Deploy to Test (x86 - Local) (push) Has been skipped
BCards Deployment Pipeline / Cleanup Old Resources (push) Has been skipped
BCards Deployment Pipeline / Deployment Summary (push) Successful in 0s
fix: login microsoft
2025-09-21 14:35:10 -03:00

85 lines
2.1 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
if [[ $# -lt 4 ]]; then
echo "Usage: $0 <stack-name> <service-name> <stack-file> <health-url> [expected-replicas]" >&2
exit 1
fi
STACK_NAME="$1"
SERVICE_NAME="$2"
STACK_FILE="$3"
HEALTH_URL="$4"
EXPECTED_REPLICAS="${5:-4}"
SERVICE_FQDN="${STACK_NAME}_${SERVICE_NAME}"
LOG_PREFIX="[swarm-deploy]"
log() {
printf '%s %s %s\n' "$(date --iso-8601=seconds)" "$LOG_PREFIX" "$*"
}
retry() {
local attempts=$1; shift
local delay=$1; shift
local n=1
while true; do
if "$@"; then
return 0
fi
if (( n == attempts )); then
return 1
fi
((n++))
sleep "$delay"
done
}
log "Deploying stack '${STACK_NAME}' using ${STACK_FILE}"
docker stack deploy --compose-file "$STACK_FILE" "$STACK_NAME"
log "Waiting for service ${SERVICE_FQDN} to reach ${EXPECTED_REPLICAS} replicas"
retries=24
while (( retries > 0 )); do
replicas_raw=$(docker service ls --filter "name=${SERVICE_FQDN}" --format '{{.Replicas}}' || true)
if [[ -z "$replicas_raw" ]]; then
log "Service ${SERVICE_FQDN} not found yet; retrying"
sleep 5
((retries--))
continue
fi
replicas_clean=${replicas_raw%% (*}
running=${replicas_clean%%/*}
desired=${replicas_clean##*/}
if [[ "$running" == "$desired" && "$running" == "$EXPECTED_REPLICAS" ]]; then
log "Service reached desired replica count: ${running}/${desired}"
break
fi
log "Current replicas ${running}/${desired}; waiting..."
sleep 5
((retries--))
done
if (( retries == 0 )); then
log "Timed out waiting for replicas"
docker service ps "$SERVICE_FQDN"
exit 1
fi
log "Checking task states"
if ! docker service ps "$SERVICE_FQDN" --no-trunc --filter 'desired-state=Running' --format '{{.CurrentState}}' | grep -q '^Running '; then
log "Some tasks are not running"
docker service ps "$SERVICE_FQDN"
exit 1
fi
log "Running health check against ${HEALTH_URL}"
if ! retry 3 5 curl -fsS "$HEALTH_URL"; then
log "Health check failed; rolling back service"
docker service update --rollback "$SERVICE_FQDN" || true
exit 1
fi
log "Health check succeeded"
log "Deployment finished successfully"