优化部署流程

This commit is contained in:
eafonyang
2026-06-30 13:50:29 +08:00
parent a52adf7e27
commit 23f712cf86
9 changed files with 362 additions and 204 deletions
+133
View File
@@ -0,0 +1,133 @@
#!/usr/bin/env bash
set -euo pipefail
REMOTE_DIR="/data/project/app-api"
show_help() {
cat <<'EOF'
用法: deploy.sh [选项] [服务器]
本地交叉编译后上传二进制到服务器。
选项:
-a 同时上传 Dockerfile 和 docker-compose.yml
-r 上传后 SSH 到服务器执行 docker compose up -d --build 重启容器
-s 跳过编译,直接使用已编译好的 bin/server-linux
-n 虚拟执行,不实际传输文件
-h, --help 显示此帮助信息
服务器:
api1 仅部署到 api1 (luxsin-api1)
api2 仅部署到 api2 (luxsin-api2)
(省略) 同时部署到 api1 和 api2
默认行为:
1. 本地执行 make build-linux 交叉编译
2. 上传编译好的二进制到服务器
示例:
deploy.sh 编译并上传二进制到 api1 和 api2
deploy.sh api1 编译并上传二进制到 api1
deploy.sh -s api1 跳过编译,直接上传已有二进制到 api1
deploy.sh -a api1 同时上传 Dockerfile + docker-compose.yml 到 api1
deploy.sh -r 编译、上传二进制并重启容器
deploy.sh -s -r api1 跳过编译,上传已有二进制并重启
deploy.sh -a -r api1 全量部署到 api1(含 Docker 文件 + 重启)
deploy.sh -n api1 虚拟执行,预览部署到 api1
EOF
}
remote_host_for() {
case "$1" in
api1) echo "luxsin-api1" ;;
api2) echo "luxsin-api2" ;;
*)
echo "未知服务器: $1(可选: api1, api2" >&2
exit 1
;;
esac
}
UPLOAD_ALL=false
RESTART=false
SKIP_BUILD=false
DRY_RUN=false
ARGS=()
for arg in "$@"; do
case "$arg" in
-a) UPLOAD_ALL=true ;;
-r) RESTART=true ;;
-s) SKIP_BUILD=true ;;
-n) DRY_RUN=true ;;
-h|--help)
show_help
exit 0
;;
*)
ARGS+=("$arg")
;;
esac
done
SERVERS=()
if [ ${#ARGS[@]} -gt 0 ] && { [ "${ARGS[0]}" = "api1" ] || [ "${ARGS[0]}" = "api2" ]; }; then
SERVERS=("${ARGS[0]}")
else
SERVERS=(api1 api2)
fi
if [ "$SKIP_BUILD" = true ]; then
echo "=== 跳过编译,使用已有二进制 ==="
if [ ! -f bin/server-linux ]; then
echo "错误: bin/server-linux 不存在,请先编译" >&2
exit 1
fi
echo " 文件: bin/server-linux ($(du -h bin/server-linux | cut -f1))"
else
echo "=== 本地编译 ==="
if [ "$DRY_RUN" = true ]; then
echo "(虚拟) make build-linux"
else
make build-linux
fi
fi
echo
rsync_opts=(-avz --progress)
if [ "$DRY_RUN" = true ]; then
rsync_opts+=(-n)
fi
for server in "${SERVERS[@]}"; do
remote_host="$(remote_host_for "$server")"
if [ "$DRY_RUN" = true ]; then
echo "=== 虚拟部署到 ${server} (${remote_host}) ==="
else
echo "=== 部署到 ${server} (${remote_host}) ==="
fi
echo " 上传二进制: bin/server-linux -> ${remote_host}:${REMOTE_DIR}/server"
rsync "${rsync_opts[@]}" bin/server-linux "${remote_host}:${REMOTE_DIR}/server"
if [ "$UPLOAD_ALL" = true ]; then
echo " 上传 Dockerfile -> ${remote_host}:${REMOTE_DIR}/Dockerfile"
rsync "${rsync_opts[@]}" Dockerfile "${remote_host}:${REMOTE_DIR}/Dockerfile"
echo " 上传 docker-compose.yml -> ${remote_host}:${REMOTE_DIR}/docker-compose.yml"
rsync "${rsync_opts[@]}" docker-compose.yml "${remote_host}:${REMOTE_DIR}/docker-compose.yml"
fi
if [ "$RESTART" = true ]; then
if [ "$DRY_RUN" = true ]; then
echo " (虚拟) SSH 重启容器: docker compose up -d --build"
else
echo " SSH 重启容器 ..."
ssh "$remote_host" "cd ${REMOTE_DIR} && docker compose up -d --build"
fi
fi
echo
done
echo "完成。"