Files
zhuangang/topics/devops/cicd/examples/pipeline/deploy.sh
T

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