feat(scripts): 增加多环境一键启停管理与分支工作流辅助脚本

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
WeiCHEN
2026-09-07 15:59:25 +08:00
co-authored by Cursor
parent 4ce8275a8a
commit dd7675eb89
2 changed files with 295 additions and 0 deletions
+168
View File
@@ -0,0 +1,168 @@
#!/usr/bin/env bash
# =============================================================================
# Chat-Agent-System 多环境与服务管理脚本 (env-service.sh)
#
# 支持环境:
# shared : 共享知识库基础设施 (pgvector / regulations-db)
# dev : 开发环境服务 (端口 8080, DB 5433, 数据隔离 ./data/dev)
# test : 测试环境服务 (端口 8081, DB 5434, 数据隔离 ./data/test)
# main : 生产环境服务 (端口 8000, DB 5435, 数据隔离 ./data/main)
# all : 所有环境
#
# 支持命令: start | stop | restart | status | logs | down
# =============================================================================
set -eo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ROOT_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
cd "${ROOT_DIR}"
ENV_TARGET="$1"
ACTION="$2"
show_usage() {
cat <<EOF
用法:
$0 <shared|dev|test|main|all> <start|stop|restart|status|logs|down>
示例:
$0 shared start # 启动共享知识库基础服务
$0 dev start # 启动开发分支环境
$0 test start # 启动测试分支环境
$0 main start # 启动主分支生产环境
$0 all status # 查看所有环境服务状态
$0 dev logs # 查看开发环境日志
$0 dev stop # 停止开发环境
EOF
exit 1
}
if [[ -z "${ENV_TARGET}" || -z "${ACTION}" ]]; then
show_usage
fi
# 确保环境变量配置文件与存储目录存在
prepare_env_file() {
local target="$1"
local env_file="configs/.env.${target}"
local env_example="configs/.env.${target}.example"
if [[ ! -f "${env_file}" ]]; then
if [[ -f "${env_example}" ]]; then
echo "[提示] 配置文件 ${env_file} 不存在,正在从 ${env_example} 自动初始化..."
cp "${env_example}" "${env_file}"
fi
fi
# 确保隔离数据目录存在
if [[ "${target}" == "shared" ]]; then
mkdir -p "data/shared/kb"
else
mkdir -p "data/${target}/workspaces"
fi
}
# 确保 Docker 共享网络已创建
ensure_shared_network() {
if ! docker network ls --format '{{.Name}}' | grep -q '^chat-agent-shared-net$'; then
echo "[网络] 创建共享基础设施 Docker 网络: chat-agent-shared-net..."
docker network create chat-agent-shared-net >/dev/null 2>&1 || true
fi
}
run_compose() {
local target="$1"
local act="$2"
local compose_file="docker-compose.${target}.yml"
local env_file="configs/.env.${target}"
if [[ ! -f "${compose_file}" ]]; then
echo "[错误] 找不到编排文件: ${compose_file}"
exit 1
fi
prepare_env_file "${target}"
local env_arg=""
if [[ -f "${env_file}" ]]; then
env_arg="--env-file ${env_file}"
fi
case "${act}" in
start)
if [[ "${target}" != "shared" ]]; then
ensure_shared_network
fi
echo "==> [${target}] 启动服务 (${compose_file})..."
docker compose -f "${compose_file}" ${env_arg} up -d
echo "==> [${target}] 服务已启动"
;;
stop)
echo "==> [${target}] 停止服务..."
docker compose -f "${compose_file}" ${env_arg} stop
;;
restart)
if [[ "${target}" != "shared" ]]; then
ensure_shared_network
fi
echo "==> [${target}] 重启服务..."
docker compose -f "${compose_file}" ${env_arg} restart
;;
status|ps)
echo "------------------------------------------------------------"
echo "环境: [${target}] (编排: ${compose_file})"
echo "------------------------------------------------------------"
docker compose -f "${compose_file}" ${env_arg} ps
echo ""
;;
logs)
docker compose -f "${compose_file}" ${env_arg} logs -f --tail=100
;;
down)
echo "==> [${target}] 清理并下线容器..."
docker compose -f "${compose_file}" ${env_arg} down
;;
*)
echo "[错误] 未知操作: ${act}"
show_usage
;;
esac
}
case "${ENV_TARGET}" in
shared|dev|test|main)
run_compose "${ENV_TARGET}" "${ACTION}"
;;
all)
case "${ACTION}" in
start)
run_compose "shared" "start"
run_compose "dev" "start"
run_compose "test" "start"
run_compose "main" "start"
;;
stop|down)
run_compose "dev" "${ACTION}"
run_compose "test" "${ACTION}"
run_compose "main" "${ACTION}"
run_compose "shared" "${ACTION}"
;;
status|ps)
run_compose "shared" "status"
run_compose "dev" "status"
run_compose "test" "status"
run_compose "main" "status"
;;
*)
echo "[错误] 'all' 仅支持 start | stop | down | status 操作"
exit 1
;;
esac
;;
*)
echo "[错误] 未知环境目标: ${ENV_TARGET}"
show_usage
;;
esac
+127
View File
@@ -0,0 +1,127 @@
#!/usr/bin/env bash
# =============================================================================
# Git 分支工作流辅助检查工具 (git-workflow-helper.sh)
# 作用:校验分支合规性、协助功能子分支检出与阶段发布节点标记
# =============================================================================
set -eo pipefail
COMMAND="$1"
ARG="$2"
CURRENT_BRANCH="$(git branch --show-current 2>/dev/null || echo '')"
show_help() {
cat <<EOF
Git 3 分支工作流辅助工具:
用法:
$0 check # 检查当前分支状态及工作流提示
$0 feature <name> # 基于 dev 检出 feature/<name> 子分支
$0 fix <name> # 基于 dev 检出 fix/<name> 子分支
$0 merge-to-dev # 将当前功能子分支测试后合回 dev
$0 promote-to-test <tag> # 将 dev 合并到 test 并打候选版本 tag (如 rc-v1.1.0-beta.1)
$0 release-to-main <tag> # 将 test 合并到 main 并打正式版本 tag (如 v1.1.0)
EOF
exit 1
}
case "${COMMAND}" in
check)
echo "=== 当前 Git 分支与工作流检查 ==="
echo "当前分支: [${CURRENT_BRANCH}]"
echo ""
case "${CURRENT_BRANCH}" in
dev)
echo "状态: 正处于【开发分支】。"
echo "提示: 可直接在此分支进行小功能渐进式提交,或创建 feature/<name> 进行复杂功能开发。"
;;
test)
echo "状态: 正处于【测试分支】。"
echo "提示: 仅用于长期实际部署和运维测试。新功能开发请切换至 dev。"
;;
main)
echo "状态: 正处于【主分支 (Release)】。"
echo "警告: 严禁直接在 main 上开发代码!只有经过 test 验证的稳定节点才能合入 main。"
;;
feature/*|fix/*)
echo "状态: 正处于功能子分支 [${CURRENT_BRANCH}]。"
echo "提示: 自测完成后,使用 '$0 merge-to-dev' 合回 dev 分支。"
;;
*)
echo "提示: 当前处于非常规分支 [${CURRENT_BRANCH}]。"
;;
esac
echo ""
git status --short
;;
feature)
if [[ -z "${ARG}" ]]; then
echo "错误: 请提供 feature 名称,例如: $0 feature session-cache"
exit 1
fi
echo "==> 从 dev 切换并创建 feature/${ARG}..."
git checkout dev
git pull --rebase origin dev 2>/dev/null || true
git checkout -b "feature/${ARG}"
echo "成功切换至 feature/${ARG}"
;;
fix)
if [[ -z "${ARG}" ]]; then
echo "错误: 请提供 fix 名称,例如: $0 fix db-pool-leak"
exit 1
fi
echo "==> 从 dev 切换并创建 fix/${ARG}..."
git checkout dev
git pull --rebase origin dev 2>/dev/null || true
git checkout -b "fix/${ARG}"
echo "成功切换至 fix/${ARG}"
;;
merge-to-dev)
if [[ "${CURRENT_BRANCH}" != feature/* && "${CURRENT_BRANCH}" != fix/* ]]; then
echo "错误: 当前分支为 ${CURRENT_BRANCH},不是 feature/* 或 fix/* 分支!"
exit 1
fi
SRC_BRANCH="${CURRENT_BRANCH}"
echo "==> 准备将 ${SRC_BRANCH} 合并回 dev 分支..."
git checkout dev
git pull --rebase origin dev 2>/dev/null || true
git merge --no-ff "${SRC_BRANCH}" -m "merge: 合并 ${SRC_BRANCH} 到开发分支 dev"
echo "合并成功!可运行 'git branch -d ${SRC_BRANCH}' 删除已合入的本地临时分支。"
;;
promote-to-test)
TAG="${ARG}"
if [[ -z "${TAG}" ]]; then
echo "错误: 请提供测试候选 Tag 名称,例如: $0 promote-to-test rc-v1.0.0-beta.1"
exit 1
fi
echo "==> 切换至 test 分支并合并 dev 当前稳定节点..."
git checkout test
git pull --rebase origin test 2>/dev/null || true
git merge --no-ff dev -m "release-candidate: 汇集 dev 功能至 test 分支,准备长期实测 [Tag: ${TAG}]"
git tag -a "${TAG}" -m "实测候选版本: ${TAG}"
echo "已成功合并至 test 并打上标签: ${TAG}!请启动 test 环境进行运维与功能测试。"
;;
release-to-main)
TAG="${ARG}"
if [[ -z "${TAG}" ]]; then
echo "错误: 请提供正式发布 Tag 名称,例如: $0 release-to-main v1.0.0"
exit 1
fi
echo "==> 切换至 main 分支并合并 test 验证节点..."
git checkout main
git pull --rebase origin main 2>/dev/null || true
git merge --no-ff test -m "release: 经长期测试与运维验证通过,正式发布 ${TAG}"
git tag -a "${TAG}" -m "正式发布版本: ${TAG}"
echo "已成功合并至 main 并打上正式发布标签: ${TAG}!"
;;
*)
show_help
;;
esac