spark-server/deploy/docker/deploy.sh
2026-09-22 17:07:26 +08:00

67 lines
2.6 KiB
Bash
Executable File

#!/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