Files

128 lines
2.9 KiB
Bash
Raw Permalink Normal View History

2026-06-05 20:15:30 +08:00
#!/usr/bin/env bash
set -euo pipefail
REMOTE_DIR="/data/project/app-api"
2026-06-12 15:50:01 +08:00
DEFAULT_PATHS=(
./cmd/
./internal/
./pkg/
./docs/
2026-06-12 15:50:01 +08:00
./go.mod
./go.sum
)
show_help() {
cat <<'EOF'
用法: upload.sh [选项] [服务器] [路径...]
将本地代码同步到远程服务器(rsync)。
选项:
-n 虚拟执行,不实际传输或删除远程文件
-h, --help 显示此帮助信息
服务器:
api1 仅上传到 api1 (luxsin-api1)
api2 仅上传到 api2 (luxsin-api2)
(省略) 同时上传到 api1 和 api2
路径:
指定要同步的文件或目录,可传多个。
省略时使用默认路径: cmd/ internal/ pkg/ docs/ go.mod go.sum
注意: Dockerfile 和 docker-compose.yml 未包含在默认路径中(如需同步请手动指定)
2026-06-12 15:50:01 +08:00
示例:
upload.sh 同步默认路径到 api1 和 api2
upload.sh api1 同步默认路径到 api1
upload.sh api2 ./internal 同步 internal/ 到 api2
upload.sh api1 Dockerfile 单独同步 Dockerfile 到 api1
2026-06-12 15:50:01 +08:00
upload.sh -n 虚拟执行,预览同步到 api1 和 api2
upload.sh -n api1 ./internal 虚拟执行,预览同步到 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_to() {
local server="$1"
shift
2026-06-12 15:50:01 +08:00
local paths=("$@")
local remote_host
remote_host="$(remote_host_for "$server")"
if [ "$DRY_RUN" = true ]; then
echo "虚拟上传到 ${server} (${remote_host}) ..."
else
echo "上传到 ${server} (${remote_host}) ..."
fi
2026-06-12 15:50:01 +08:00
local rsync_opts=(-avz --progress)
if [ "$DRY_RUN" = true ]; then
rsync_opts+=(-n)
fi
local item rel remote_path
for item in "${paths[@]}"; do
rel="${item#./}"
rel="${rel%/}" # 剥离尾部斜杠,避免拼接时出现双斜杠
remote_path="${REMOTE_DIR}/${rel}"
2026-06-12 15:50:01 +08:00
if [[ -d "$item" ]]; then
echo " 同步目录: $item -> ${remote_host}:${remote_path}/"
rsync "${rsync_opts[@]}" --delete "${item}/" "${remote_host}:${remote_path}/"
else
echo " 同步文件: $item -> ${remote_host}:${remote_path}"
rsync "${rsync_opts[@]}" "$item" "${remote_host}:${remote_path}"
fi
done
}
DRY_RUN=false
ARGS=()
for arg in "$@"; do
case "$arg" in
-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]}")
ARGS=("${ARGS[@]:1}")
2026-06-05 20:15:30 +08:00
else
2026-06-12 15:50:01 +08:00
SERVERS=(api1 api2)
2026-06-05 20:15:30 +08:00
fi
2026-06-12 15:50:01 +08:00
if [ ${#ARGS[@]} -eq 0 ]; then
PATHS=("${DEFAULT_PATHS[@]}")
else
PATHS=("${ARGS[@]}")
fi
2026-06-11 11:12:19 +08:00
2026-06-12 15:50:01 +08:00
for server in "${SERVERS[@]}"; do
upload_to "$server" "${PATHS[@]}"
echo
2026-06-11 11:12:19 +08:00
done
2026-06-12 15:50:01 +08:00
echo "完成。"