feat(deploy): 优化部署脚本,添加 dry-run、备份、SSH 复用

This commit is contained in:
2026-04-19 00:20:06 +08:00
parent 9d452c4e75
commit 44aa62da49
3 changed files with 324 additions and 64 deletions

View File

@@ -2,8 +2,8 @@
set -euo pipefail
DEVELOPMENT_RUST_URL="http://127.0.0.1:8080"
PRODUCTION_DOMAIN="https://xmclassmate.top"
# 从环境变量获取测试域名deploy.sh 传入)
DOMAIN="${TEST_DOMAIN:-https://xmclassmate.top}"
RED='\033[0;31m'
GREEN='\033[0;32m'
@@ -14,56 +14,58 @@ log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
check_local_backend() {
log_info "测试本地后端服务 (127.0.0.1:8080)..."
check_health() {
local url="${1}/health"
log_info "检查健康端点: ${url}"
local status_code
status_code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "${DEVELOPMENT_RUST_URL}/health" 2>/dev/null || echo "000")
status_code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "${url}" 2>/dev/null || echo "000")
if [ "$status_code" = "200" ]; then
log_info "本地后端服务正常 (HTTP $status_code)"
log_info "健康检查通过 (HTTP $status_code)"
return 0
else
log_error "本地后端服务异常 (HTTP $status_code)"
log_error "健康检查失败 (HTTP $status_code)"
return 1
fi
}
check_domain_access() {
log_info "测试域名访问 (${PRODUCTION_DOMAIN}/dev)..."
check_api() {
local url="${1}/dev"
log_info "检查 API 端点: ${url}"
local status_code
status_code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 -L -k \
status_code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 -k \
-H "Host: xmclassmate.top" \
"${PRODUCTION_DOMAIN}/dev" 2>/dev/null || echo "000")
"${url}" 2>/dev/null || echo "000")
if [ "$status_code" = "200" ] || [ "$status_code" = "301" ] || [ "$status_code" = "302" ]; then
log_info "域名访问正常 (HTTP $status_code)"
if [ "$status_code" = "200" ] || [ "$status_code" = "401" ] || [ "$status_code" = "301" ] || [ "$status_code" = "302" ]; then
log_info "API 端点正常 (HTTP $status_code)"
return 0
else
log_error "域名访问异常 (HTTP $status_code)"
log_error "API 端点异常 (HTTP $status_code)"
return 1
fi
}
check_static_files() {
log_info "测试静态文件服务..."
local test_files=(
local static_files=(
"/static/katex/katex.min.css"
"/static/css/style.css"
"/static/favicon.ico"
)
log_info "检查静态文件..."
local failed=0
for file in "${test_files[@]}"; do
for file in "${static_files[@]}"; do
local status_code
status_code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 -L -k \
status_code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 -k \
-H "Host: xmclassmate.top" \
"${PRODUCTION_DOMAIN}${file}" 2>/dev/null || echo "000")
"${DOMAIN}${file}" 2>/dev/null || echo "000")
if [ "$status_code" = "200" ]; then
log_info "静态文件 ${file} 正常 (HTTP $status_code)"
log_info "静态文件 ${file} 正常"
else
log_error "静态文件 ${file} 异常 (HTTP $status_code)"
failed=1
@@ -76,11 +78,17 @@ check_static_files() {
main() {
local failed=0
if ! check_local_backend; then
echo ""
echo -e "${YELLOW}========== 部署后测试 ==========${NC}"
echo -e " 测试域名: ${DOMAIN}"
echo -e "================================${NC}"
echo ""
if ! check_health "${DOMAIN}"; then
failed=1
fi
if ! check_domain_access; then
if ! check_api "${DOMAIN}"; then
failed=1
fi
@@ -88,6 +96,7 @@ main() {
failed=1
fi
echo ""
if [ $failed -eq 0 ]; then
log_info "========== 所有测试通过 =========="
exit 0
@@ -97,4 +106,4 @@ main() {
fi
}
main "$@"
main "$@"