From b5b5784df5171d3a8e5df55bf06c770b8bc624ee Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 11 Aug 2026 14:40:31 +0800 Subject: [PATCH] feat: add build.sh for one-click deployment on pccs.opencomputing.cn --- build.sh | 430 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 430 insertions(+) create mode 100644 build.sh diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..c7ed9ab --- /dev/null +++ b/build.sh @@ -0,0 +1,430 @@ +#!/usr/bin/env bash +# ============================================================ +# pccs build.sh — 一键部署脚本 +# 在部署节点 (pccs@pccs.opencomputing.cn) 上直接运行: +# cd /d/pccs/repos/pccs && bash build.sh +# +# 前提: +# 1. /d 已作为 NFS 共享盘挂载 +# 2. MariaDB 已安装, 数据库 pccs 已创建, 用户 test/test123 已授权 +# 3. 部署节点已安装 git, python3.10+, pip +# ============================================================ +set -e + +SERVER_PATH="${SERVER_PATH:-/d/pccs}" +REPOS_DIR="${SERVER_PATH}/repos" +VENV_DIR="${SERVER_PATH}/venv" +CONF_DIR="${SERVER_PATH}/conf" +LOG_DIR="${SERVER_PATH}/logs" +RUN_DIR="${SERVER_PATH}/run" +APP_PORT="${APP_PORT:-9180}" + +# --------------- 模块列表 --------------- +# 共享底层库 (pip install) +SHARED_LIBS=( + apppublic + sqlor + ahserver + appbase + rbac +) +# pccs 业务模块 (pip install) +PCCS_MODULES=( + pcpool + pcc + storage_mgr + image_mgr +) +# 前端 bricks (需要构建) +BRICKS_DIR="${REPOS_DIR}/bricks" + +# --------------- 颜色输出 --------------- +red() { echo -e "\033[31m$1\033[0m"; } +green() { echo -e "\033[32m$1\033[0m"; } +blue() { echo -e "\033[34m$1\033[0m"; } + +echo "==========================================" +blue "PCCS 算力中心集群系统 — 一键部署" +echo "==========================================" +echo "部署路径: ${SERVER_PATH}" +echo "监听端口: ${APP_PORT}" +echo "" + +# ============================================================ +# Phase 0: 创建目录结构 +# ============================================================ +blue "[Phase 0] 创建目录结构..." +mkdir -p "${REPOS_DIR}" "${VENV_DIR}" "${CONF_DIR}" "${LOG_DIR}" "${RUN_DIR}" +green " 目录结构已创建" + +# ============================================================ +# Phase 1: 安装系统依赖 +# ============================================================ +blue "[Phase 1] 安装系统依赖..." +sudo apt-get update -qq +sudo apt-get install -y -qq python3-venv python3-pip python3-dev build-essential nfs-common +green " 系统依赖已安装" + +# ============================================================ +# Phase 2: Clone/Pull 所有仓库 (HTTPS, 只读) +# ============================================================ +blue "[Phase 2] Clone/Pull 代码仓库..." + +GIT_BASE="https://git.opencomputing.cn/yumoqing" +ALL_REPOS=("${SHARED_LIBS[@]}" "${PCCS_MODULES[@]}" "bricks" "pccs") + +for repo in "${ALL_REPOS[@]}"; do + if [ -d "${REPOS_DIR}/${repo}/.git" ]; then + echo " [pull] ${repo}..." + (cd "${REPOS_DIR}/${repo}" && git pull origin main 2>/dev/null) || true + else + echo " [clone] ${repo}..." + git clone "${GIT_BASE}/${repo}.git" "${REPOS_DIR}/${repo}" 2>/dev/null || { + red " 警告: ${repo} clone 失败, 跳过" + } + fi +done +green " 代码仓库已同步" + +# ============================================================ +# Phase 3: 创建 Python 虚拟环境 +# ============================================================ +blue "[Phase 3] 创建 Python 虚拟环境..." +python3 -m venv "${VENV_DIR}" --clear +PIP="${VENV_DIR}/bin/pip" +PYTHON="${VENV_DIR}/bin/python" +# 升级 pip +"${PIP}" install --upgrade pip setuptools wheel -q +green " 虚拟环境已创建: ${VENV_DIR}" + +# ============================================================ +# Phase 4: 安装共享底层库 (develop 模式) +# ============================================================ +blue "[Phase 4] 安装共享底层库..." +for lib in "${SHARED_LIBS[@]}"; do + lib_path="${REPOS_DIR}/${lib}" + if [ -f "${lib_path}/setup.py" ] || [ -f "${lib_path}/setup.cfg" ] || [ -f "${lib_path}/pyproject.toml" ]; then + echo " [install] ${lib}..." + "${PIP}" install -e "${lib_path}" -q 2>&1 | tail -1 + else + echo " [skip] ${lib} — 无 setup" + fi +done +green " 共享底层库已安装" + +# ============================================================ +# Phase 5: 安装 pccs 业务模块 (develop 模式) +# ============================================================ +blue "[Phase 5] 安装 pccs 业务模块..." +for mod in "${PCCS_MODULES[@]}"; do + mod_path="${REPOS_DIR}/${mod}" + if [ -f "${mod_path}/setup.json" ] || [ -f "${mod_path}/setup.py" ] || [ -f "${mod_path}/setup.cfg" ]; then + echo " [install] ${mod}..." + "${PIP}" install -e "${mod_path}" -q 2>&1 | tail -1 + else + echo " [skip] ${mod} — 无 setup" + fi +done +green " pccs 业务模块已安装" + +# ============================================================ +# Phase 6: 构建 Bricks 前端 +# ============================================================ +blue "[Phase 6] 构建 Bricks 前端..." +if [ -f "${BRICKS_DIR}/build.sh" ]; then + echo " 构建 bricks.js..." + (cd "${BRICKS_DIR}" && npm install --silent 2>/dev/null && bash build.sh 2>&1 | tail -3) || { + red " 警告: bricks 构建失败, 前端可能不可用" + } +fi +green " Bricks 前端已构建" + +# ============================================================ +# Phase 7: 创建配置文件 +# ============================================================ +blue "[Phase 7] 创建配置..." +cat > "${CONF_DIR}/config.json" < "${RUN_DIR}/start.sh" <&1 | tee -a "\${LOG_DIR}/pccs.log" +STARTEOF +chmod +x "${RUN_DIR}/start.sh" +green " 启动脚本: ${RUN_DIR}/start.sh" + +# ============================================================ +# Phase 11: 停止旧进程, 启动应用 +# ============================================================ +blue "[Phase 11] 启动应用..." +# 停止旧进程 +pkill -f "ahserver.*${APP_PORT}" 2>/dev/null || true +sleep 1 + +# 后台启动 +nohup bash "${RUN_DIR}/start.sh" > "${LOG_DIR}/nohup.log" 2>&1 & +sleep 3 + +# 健康检查 +if curl -s -o /dev/null -w "%{http_code}" "http://127.0.0.1:${APP_PORT}/" 2>/dev/null | grep -q '200\|302\|404'; then + green " pccs 应用已启动: http://127.0.0.1:${APP_PORT}" +else + red " 警告: 应用可能未正常启动, 检查日志: tail -f ${LOG_DIR}/pccs.log" +fi + +# ============================================================ +# 完成 +# ============================================================ +echo "" +green "==========================================" +green " pccs 部署完成!" +green " 访问地址: http://$(hostname -I | awk '{print $1}'):${APP_PORT}" +green " 日志文件: ${LOG_DIR}/pccs.log" +green " 启动命令: bash ${RUN_DIR}/start.sh" +green " 停止命令: pkill -f 'ahserver.*${APP_PORT}'" +green "=========================================="