118 lines
3.6 KiB
Bash
Executable File
118 lines
3.6 KiB
Bash
Executable File
#!/bin/bash
|
||
set -e
|
||
|
||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
|
||
COMPOSE_FILE="$SCRIPT_DIR/docker-compose.yml"
|
||
|
||
cd "$SCRIPT_DIR"
|
||
|
||
# 检查 .env
|
||
if [ ! -f .env ]; then
|
||
echo "❌ 未找到 .env,请先执行:cp .env.example .env && vim .env"
|
||
exit 1
|
||
fi
|
||
|
||
CMD="${1:-help}"
|
||
BRANCH="${2:-master}"
|
||
|
||
case "$CMD" in
|
||
|
||
start)
|
||
IMAGE_NAME="$(grep APP_NAME .env | cut -d= -f2 | tr -d '"' | tr -d "'" | xargs)-frontend:latest"
|
||
IMAGE_NAME="${IMAGE_NAME:-ghb-frontend:latest}"
|
||
if ! docker image inspect "$IMAGE_NAME" > /dev/null 2>&1; then
|
||
echo "❌ 镜像 $IMAGE_NAME 不存在,请先执行: bash deploy.sh build"
|
||
exit 1
|
||
fi
|
||
echo ">>> 停掉旧容器..."
|
||
docker compose -f "$COMPOSE_FILE" down 2>/dev/null || true
|
||
echo ""
|
||
echo ">>> 启动..."
|
||
docker compose -f "$COMPOSE_FILE" up -d --force-recreate
|
||
echo ""
|
||
echo "✅ 已启动"
|
||
echo " 地址: http://localhost:$(grep FRONTEND_PORT .env | cut -d= -f2 | tr -d '"' | tr -d "'" | xargs)"
|
||
echo " 日志: bash deploy.sh logs"
|
||
;;
|
||
|
||
build)
|
||
echo ">>> 宿主机构建 dist..."
|
||
cd "$PROJECT_DIR"
|
||
|
||
if ! command -v pnpm &> /dev/null; then
|
||
echo "安装 pnpm..."
|
||
npm install -g pnpm
|
||
fi
|
||
|
||
pnpm install
|
||
pnpm build
|
||
|
||
echo ""
|
||
echo ">>> 编译 Docker 镜像..."
|
||
cd "$SCRIPT_DIR"
|
||
docker compose -f "$COMPOSE_FILE" build frontend
|
||
echo ""
|
||
echo "✅ 编译完成,执行 bash deploy.sh start 启动"
|
||
;;
|
||
|
||
rebuild)
|
||
echo ">>> 切到分支 ${BRANCH} 并拉取最新代码..."
|
||
cd "$PROJECT_DIR"
|
||
git fetch origin
|
||
git checkout "${BRANCH}"
|
||
git pull origin "${BRANCH}"
|
||
|
||
echo ""
|
||
echo ">>> 宿主机构建 dist..."
|
||
if ! command -v pnpm &> /dev/null; then
|
||
echo "安装 pnpm..."
|
||
npm install -g pnpm
|
||
fi
|
||
|
||
pnpm install
|
||
pnpm build
|
||
|
||
echo ""
|
||
echo ">>> 重新编译 + 启动..."
|
||
cd "$SCRIPT_DIR"
|
||
docker compose -f "$COMPOSE_FILE" down 2>/dev/null || true
|
||
docker compose -f "$COMPOSE_FILE" build frontend
|
||
docker compose -f "$COMPOSE_FILE" up -d --force-recreate
|
||
echo ""
|
||
echo "✅ 重新部署完成(分支: ${BRANCH})"
|
||
echo " 前端地址: http://localhost:$(grep FRONTEND_PORT .env | cut -d= -f2 | tr -d '"' | tr -d "'" | xargs)"
|
||
;;
|
||
|
||
stop)
|
||
docker compose -f "$COMPOSE_FILE" down 2>/dev/null || true
|
||
echo "✅ 已停止"
|
||
;;
|
||
|
||
logs)
|
||
docker compose -f "$COMPOSE_FILE" logs -f --tail=200
|
||
;;
|
||
|
||
status)
|
||
docker compose -f "$COMPOSE_FILE" ps -a
|
||
;;
|
||
|
||
*)
|
||
echo "用法: bash deploy.sh <命令> [分支]"
|
||
echo ""
|
||
echo " start 停旧容器 → 启动(日常使用,不重新编译)"
|
||
echo " build 编译 dist + 编译镜像(代码变更后用一次)"
|
||
echo " rebuild [分支] 拉取分支代码 + 编译 + 启动(一步到位)"
|
||
echo " stop 停止"
|
||
echo " logs 查看日志"
|
||
echo " status 查看容器状态"
|
||
echo ""
|
||
echo "分支参数默认 master,示例:"
|
||
echo " bash deploy.sh rebuild test"
|
||
echo ""
|
||
echo "首次部署:cp .env.example .env && vim .env && bash deploy.sh rebuild"
|
||
echo "日常更新:bash deploy.sh start"
|
||
echo "代码变更:bash deploy.sh rebuild <分支>"
|
||
;;
|
||
esac
|