#!/usr/bin/env bash # Build linux/amd64 binaries + runtime image locally, deploy to ECS, with rollback on health failure. set -euo pipefail DIR="$(cd "$(dirname "$0")" && pwd)" # shellcheck source=lib.sh source "$DIR/lib.sh" deploy_lib_init ROOT="$ROOT" RELEASE="$(deploy_lib_release "$ROOT")" IMAGE_VERSIONED="${IMAGE_BASE}:${RELEASE}" TAR_VERSIONED="$ROOT/bin/spark-server-${RELEASE}.tar.gz" TAR_LATEST="$ROOT/bin/spark-server.tar.gz" deploy_lib_need_tools echo "==> release $RELEASE" echo "==> local linux/amd64 binaries + image" make -C "$ROOT" image IMAGE="$IMAGE_LATEST" docker tag "$IMAGE_LATEST" "$IMAGE_VERSIONED" mkdir -p "$(dirname "$TAR_VERSIONED")" docker save "$IMAGE_VERSIONED" | gzip -c >"$TAR_VERSIONED" cp -f "$TAR_VERSIONED" "$TAR_LATEST" echo "image $(docker image inspect "$IMAGE_LATEST" --format '{{.Size}}') bytes, tar $(wc -c <"$TAR_VERSIONED") bytes" echo "==> upload (config on host is never overwritten unless SPARK_UPLOAD_CONFIG=1)" "${SSH[@]}" "mkdir -p $DATA/compose $DATA/configs $DATA/logs $DATA/images $DATA/releases" echo "==> stamp rollback point on host (before image load)" deploy_lib_remote_stamp_rollback "$DATA" "${SCP[@]}" "$TAR_VERSIONED" "$HOST:$DATA/images/$(basename "$TAR_VERSIONED")" "${SCP[@]}" "$TAR_LATEST" "$HOST:$DATA/images/spark-server.tar.gz" "${SCP[@]}" "$ROOT/deploy/docker/docker-compose.yaml" "$HOST:$DATA/compose/docker-compose.yaml" if [[ "${SPARK_UPLOAD_CONFIG:-0}" == "1" ]]; then echo "==> upload config (SPARK_UPLOAD_CONFIG=1)" "${SCP[@]}" "$ROOT/deploy/docker/config.docker.yaml" "$HOST:$DATA/configs/config.yaml" fi rsync -az -e "ssh -i $KEY -o BatchMode=yes" \ "$ROOT/deploy/nginx/host/" "$HOST:/tmp/spark-nginx-host/" echo "==> load, migrate, start" deploy_lib_remote_load_and_up "$DATA" "$DATA/images/$(basename "$TAR_VERSIONED")" 1 "$RELEASE" echo "==> nginx reload" deploy_lib_remote_nginx_reload echo "==> health check" if deploy_lib_remote_health 12 5; then deploy_lib_remote_write_manifest "$DATA" "$RELEASE" "$(basename "$TAR_VERSIONED")" "ok" deploy_lib_remote_ps echo "==> deploy OK ($RELEASE)" "${SSH[@]}" "curl -fsS http://127.0.0.1:18080/healthz && echo && curl -fsS http://127.0.0.1:18080/readyz && echo" exit 0 fi echo "==> health check failed — rolling back app to spark-server:rollback" >&2 if deploy_lib_remote_rollback "$DATA" && deploy_lib_remote_health 8 5; then deploy_lib_remote_write_manifest "$DATA" "$RELEASE" "$(basename "$TAR_VERSIONED")" "failed_rolled_back" deploy_lib_remote_ps echo "rolled back to previous image; fix the build and redeploy" >&2 exit 1 fi echo "==> rollback also failed — check docker logs on host" >&2 deploy_lib_remote_ps exit 2