42 lines
1.1 KiB
Bash
42 lines
1.1 KiB
Bash
#!/usr/bin/env bash
|
|
# 不自动运行:单机 Docker Compose 部署脚本示例——拉取指定版本、健康检查、失败自动回滚
|
|
# 用法:IMAGE_TAG=<提交哈希> ./deploy.sh
|
|
# 约定:compose.yaml 里 api 服务的镜像写成 image: registry.example.com/app/api:${IMAGE_TAG}
|
|
set -euo pipefail
|
|
|
|
: "${IMAGE_TAG:?需要指定 IMAGE_TAG}"
|
|
HEALTH_URL="${HEALTH_URL:-http://127.0.0.1:8080/healthz}"
|
|
STATE_FILE="${STATE_FILE:-.deployed_tag}"
|
|
previous="$(cat "$STATE_FILE" 2>/dev/null || true)"
|
|
|
|
deploy() {
|
|
local tag="$1"
|
|
echo "部署版本 $tag"
|
|
IMAGE_TAG="$tag" docker compose pull api
|
|
IMAGE_TAG="$tag" docker compose up -d --no-deps api
|
|
}
|
|
|
|
healthy() {
|
|
for _ in $(seq 1 30); do
|
|
if curl -fsS --max-time 2 "$HEALTH_URL" >/dev/null; then
|
|
return 0
|
|
fi
|
|
sleep 2
|
|
done
|
|
return 1
|
|
}
|
|
|
|
deploy "$IMAGE_TAG"
|
|
if healthy; then
|
|
echo "$IMAGE_TAG" > "$STATE_FILE"
|
|
echo "部署成功:$IMAGE_TAG"
|
|
else
|
|
echo "健康检查失败" >&2
|
|
if [[ -n "$previous" ]]; then
|
|
echo "回滚到 $previous" >&2
|
|
deploy "$previous"
|
|
healthy && echo "已回滚到 $previous" >&2
|
|
fi
|
|
exit 1
|
|
fi
|