test
This commit is contained in:
22
README.md
22
README.md
@@ -57,6 +57,7 @@ ssh -T git@github.com
|
|||||||
|
|
||||||
```
|
```
|
||||||
deploy-test/
|
deploy-test/
|
||||||
|
├── dt.sh # 总控快捷入口:pull/build/start/stop/restart/status
|
||||||
├── 00-init-tools.sh # 步骤0(可选):Linux 服务器安装 Go / Node / Docker、GOPROXY、GitHub HTTPS 重写
|
├── 00-init-tools.sh # 步骤0(可选):Linux 服务器安装 Go / Node / Docker、GOPROXY、GitHub HTTPS 重写
|
||||||
├── common.sh # 公共函数库(路径、日志函数)
|
├── common.sh # 公共函数库(路径、日志函数)
|
||||||
├── 01-init-env.sh # 步骤1:写入 .env.deploy-test(已存在则覆盖,旧文件带时间戳备份)
|
├── 01-init-env.sh # 步骤1:写入 .env.deploy-test(已存在则覆盖,旧文件带时间戳备份)
|
||||||
@@ -91,6 +92,27 @@ deploy-test/
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## 快捷入口:`dt.sh`
|
||||||
|
|
||||||
|
`dt.sh` 是 `deploy-test` 的总控脚本,放在 `deploy-test/` 目录内,但会扫描 **deploy-test 上级目录** 下的所有 Git 工程。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./deploy-test/dt.sh pull # 拉取所有工程最新代码(fetch + pull --ff-only)
|
||||||
|
./deploy-test/dt.sh build # 编译后端服务
|
||||||
|
./deploy-test/dt.sh start # 启动 deploy-test 后端服务
|
||||||
|
./deploy-test/dt.sh stop # 停止 deploy-test 后端服务
|
||||||
|
./deploy-test/dt.sh restart # 重启 deploy-test 后端服务
|
||||||
|
./deploy-test/dt.sh status # 查看服务状态
|
||||||
|
./deploy-test/dt.sh fe-start pc # 启动 pc 前端
|
||||||
|
./deploy-test/dt.sh fe-stop pc # 停止 pc 前端
|
||||||
|
./deploy-test/dt.sh up # pull + build + restart
|
||||||
|
./deploy-test/dt.sh deploy # pull + build + restart + status
|
||||||
|
```
|
||||||
|
|
||||||
|
`pull` 是安全更新:只执行 `git fetch --all --prune` 和 `git pull --ff-only`。如果某工程有本地未提交改动,脚本只会 `fetch` 并提示,不会 `reset` 或覆盖本地修改。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 步骤 0:`00-init-tools.sh`(裸机 / 新服务器)
|
## 步骤 0:`00-init-tools.sh`(裸机 / 新服务器)
|
||||||
|
|
||||||
在**尚未安装 Go、Node、Docker** 的 Linux 测试服务器上,先执行本脚本再跑 `01-init-env.sh` 及后续步骤。`setup.sh` **不会**自动调用它,需手动执行。
|
在**尚未安装 Go、Node、Docker** 的 Linux 测试服务器上,先执行本脚本再跑 `01-init-env.sh` 及后续步骤。`setup.sh` **不会**自动调用它,需手动执行。
|
||||||
|
|||||||
218
dt.sh
Executable file
218
dt.sh
Executable file
@@ -0,0 +1,218 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# =============================================================================
|
||||||
|
# dt.sh — deploy-test 总控脚本
|
||||||
|
#
|
||||||
|
# 放置位置:deploy-test 目录内。
|
||||||
|
#
|
||||||
|
# 功能:
|
||||||
|
# 1. 一键拉取 deploy-test 上级目录下所有 Git 工程的最新代码
|
||||||
|
# 2. 快捷调用 deploy-test 的编译、启动、停止、重启、状态检查
|
||||||
|
# 3. 快捷管理 deploy-test 前端服务
|
||||||
|
#
|
||||||
|
# 注意:
|
||||||
|
# - pull 只执行 fetch + pull --ff-only,不会 git reset,不会覆盖本地改动。
|
||||||
|
# - 如果某工程存在本地提交/本地改动导致无法快进,会跳过并提示手动处理。
|
||||||
|
# =============================================================================
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
DEPLOY_TEST_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
ROOT_DIR="$(cd "$DEPLOY_TEST_DIR/.." && pwd)"
|
||||||
|
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
BOLD='\033[1m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
info() { echo -e "${BLUE}[INFO]${NC} $*"; }
|
||||||
|
ok() { echo -e "${GREEN}[OK]${NC} $*"; }
|
||||||
|
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
|
||||||
|
err() { echo -e "${RED}[ERROR]${NC} $*" >&2; }
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat <<EOF
|
||||||
|
用法:
|
||||||
|
./deploy-test/dt.sh <command> [args...]
|
||||||
|
|
||||||
|
代码更新:
|
||||||
|
pull 拉取 deploy-test 上级目录下所有 Git 工程
|
||||||
|
|
||||||
|
deploy-test 后端/基础服务:
|
||||||
|
build 调用 deploy-test/04-build.sh
|
||||||
|
start 调用 deploy-test/05-start.sh
|
||||||
|
stop 调用 deploy-test/stop.sh
|
||||||
|
restart 调用 deploy-test/restart.sh
|
||||||
|
status 调用 deploy-test/status.sh
|
||||||
|
|
||||||
|
deploy-test 前端:
|
||||||
|
fe-start [project] 调用 deploy-test/07-start-frontend.sh [project]
|
||||||
|
fe-stop [project] 调用 deploy-test/stop-frontend.sh [project]
|
||||||
|
|
||||||
|
常用组合:
|
||||||
|
up pull + build + restart
|
||||||
|
deploy pull + build + restart + status
|
||||||
|
|
||||||
|
其它:
|
||||||
|
help 显示帮助
|
||||||
|
|
||||||
|
示例:
|
||||||
|
./deploy-test/dt.sh pull
|
||||||
|
./deploy-test/dt.sh build
|
||||||
|
./deploy-test/dt.sh restart
|
||||||
|
./deploy-test/dt.sh fe-start pc
|
||||||
|
./deploy-test/dt.sh deploy
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
require_deploy_test() {
|
||||||
|
if [[ ! -d "$DEPLOY_TEST_DIR" ]]; then
|
||||||
|
err "未找到 deploy-test 目录: $DEPLOY_TEST_DIR"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
run_deploy_test_script() {
|
||||||
|
local script="$1"
|
||||||
|
shift || true
|
||||||
|
require_deploy_test
|
||||||
|
local path="$DEPLOY_TEST_DIR/$script"
|
||||||
|
if [[ ! -f "$path" ]]; then
|
||||||
|
err "脚本不存在: $path"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [[ ! -x "$path" ]]; then
|
||||||
|
chmod +x "$path" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
info "执行: ./deploy-test/$script $*"
|
||||||
|
(
|
||||||
|
cd "$ROOT_DIR"
|
||||||
|
"./deploy-test/$script" "$@"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
current_branch() {
|
||||||
|
git symbolic-ref --quiet --short HEAD 2>/dev/null || true
|
||||||
|
}
|
||||||
|
|
||||||
|
update_one_repo() {
|
||||||
|
local repo_dir="$1"
|
||||||
|
local name
|
||||||
|
name="$(basename "$repo_dir")"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
info "更新工程: $name"
|
||||||
|
|
||||||
|
(
|
||||||
|
cd "$repo_dir"
|
||||||
|
|
||||||
|
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
|
||||||
|
warn "$name 不是有效 Git 工作区,跳过"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
local branch
|
||||||
|
branch="$(current_branch)"
|
||||||
|
if [[ -z "$branch" ]]; then
|
||||||
|
warn "$name 当前是 detached HEAD,跳过自动 pull"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
local upstream
|
||||||
|
upstream="$(git rev-parse --abbrev-ref --symbolic-full-name '@{u}' 2>/dev/null || true)"
|
||||||
|
if [[ -z "$upstream" ]]; then
|
||||||
|
warn "$name 分支 $branch 未设置 upstream,跳过自动 pull"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! git fetch --all --prune; then
|
||||||
|
warn "$name git fetch 失败,跳过"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if git diff --quiet && git diff --cached --quiet; then
|
||||||
|
if git pull --ff-only; then
|
||||||
|
ok "$name 已更新到最新 ($branch -> $upstream)"
|
||||||
|
else
|
||||||
|
warn "$name 无法 fast-forward,请手动处理分支差异"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
warn "$name 存在本地未提交改动,只 fetch 不 pull,避免覆盖你的修改"
|
||||||
|
local behind
|
||||||
|
behind="$(git rev-list --count "HEAD..$upstream" 2>/dev/null || echo "?")"
|
||||||
|
warn "$name 当前落后 upstream: $behind 个提交"
|
||||||
|
fi
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
update_all_repos() {
|
||||||
|
info "扫描 Git 工程: $ROOT_DIR"
|
||||||
|
local found=0
|
||||||
|
local repo
|
||||||
|
for repo in "$ROOT_DIR"/*; do
|
||||||
|
[[ -d "$repo/.git" ]] || continue
|
||||||
|
found=1
|
||||||
|
update_one_repo "$repo"
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ "$found" -eq 0 ]]; then
|
||||||
|
warn "未发现一级 Git 工程"
|
||||||
|
else
|
||||||
|
echo ""
|
||||||
|
ok "代码更新流程完成"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
local cmd="${1:-help}"
|
||||||
|
shift || true
|
||||||
|
|
||||||
|
case "$cmd" in
|
||||||
|
help|-h|--help)
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
pull|update)
|
||||||
|
update_all_repos
|
||||||
|
;;
|
||||||
|
build)
|
||||||
|
run_deploy_test_script "04-build.sh" "$@"
|
||||||
|
;;
|
||||||
|
start)
|
||||||
|
run_deploy_test_script "05-start.sh" "$@"
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
run_deploy_test_script "stop.sh" "$@"
|
||||||
|
;;
|
||||||
|
restart)
|
||||||
|
run_deploy_test_script "restart.sh" "$@"
|
||||||
|
;;
|
||||||
|
status)
|
||||||
|
run_deploy_test_script "status.sh" "$@"
|
||||||
|
;;
|
||||||
|
fe-start)
|
||||||
|
run_deploy_test_script "07-start-frontend.sh" "$@"
|
||||||
|
;;
|
||||||
|
fe-stop)
|
||||||
|
run_deploy_test_script "stop-frontend.sh" "$@"
|
||||||
|
;;
|
||||||
|
up)
|
||||||
|
update_all_repos
|
||||||
|
run_deploy_test_script "04-build.sh"
|
||||||
|
run_deploy_test_script "restart.sh"
|
||||||
|
;;
|
||||||
|
deploy)
|
||||||
|
update_all_repos
|
||||||
|
run_deploy_test_script "04-build.sh"
|
||||||
|
run_deploy_test_script "restart.sh"
|
||||||
|
run_deploy_test_script "status.sh"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
err "未知命令: $cmd"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
main "$@"
|
||||||
Reference in New Issue
Block a user