feat(deploy): 添加自动部署脚本并更新相关配置
添加部署脚本 scripts/deploy.sh 实现一键部署流程 更新 package.json 添加 deploy 命令 修改 .env.production 中的资源路径为 CDN 地址 更新 README.md 添加部署脚本使用说明
Showing
4 changed files
with
169 additions
and
3 deletions
| ... | @@ -203,6 +203,18 @@ API 请求基于 Axios 封装,配置文件位于 `src/utils/request.js`,支 | ... | @@ -203,6 +203,18 @@ API 请求基于 Axios 封装,配置文件位于 `src/utils/request.js`,支 |
| 203 | - Netlify | 203 | - Netlify |
| 204 | - GitHub Pages | 204 | - GitHub Pages |
| 205 | 205 | ||
| 206 | +### 自动部署脚本 | ||
| 207 | + | ||
| 208 | +- 在 `scripts/deploy.sh` 提供一键部署脚本,串行执行: | ||
| 209 | + - 构建项目:`npm run build` | ||
| 210 | + - 上传静态资源到七牛云:`qshell qupload ~/.qshell/upload.conf` | ||
| 211 | + - 打包并上传到服务器:打包 `stdj`,通过 `scp -P 12101` 上传到 `zhsy@oa.jcedu.org:/home/www/f`,远端解压后删除压缩包 | ||
| 212 | + | ||
| 213 | +- 使用方法: | ||
| 214 | + - 先确保本机安装 `qshell` 且 `~/.qshell/upload.conf` 已正确配置 | ||
| 215 | + - 运行:`bash scripts/deploy.sh` | ||
| 216 | + - 可根据需要在脚本内调整服务器地址、端口与远端目录 | ||
| 217 | + | ||
| 206 | ### 注意事项 | 218 | ### 注意事项 |
| 207 | 219 | ||
| 208 | 1. 如果部署到子路径,需要在 `vite.config.js` 中配置 `base` 选项 | 220 | 1. 如果部署到子路径,需要在 `vite.config.js` 中配置 `base` 选项 | ... | ... |
| ... | @@ -15,8 +15,8 @@ | ... | @@ -15,8 +15,8 @@ |
| 15 | "scp-xys": "scp -P 12101 dist.tar.gz zhsy@oa.jcedu.org:/home/www/f", | 15 | "scp-xys": "scp -P 12101 dist.tar.gz zhsy@oa.jcedu.org:/home/www/f", |
| 16 | "dec-xys": "ssh -p 12101 zhsy@oa.jcedu.org 'cd /home/www/f && tar -xzvf dist.tar.gz && rm -rf dist.tar.gz'", | 16 | "dec-xys": "ssh -p 12101 zhsy@oa.jcedu.org 'cd /home/www/f && tar -xzvf dist.tar.gz && rm -rf dist.tar.gz'", |
| 17 | "remove_tar": "rm -rf dist.tar.gz", | 17 | "remove_tar": "rm -rf dist.tar.gz", |
| 18 | - "remove_dist": "rm -rf stdj", | 18 | + "xys_upload": "npm run build_tar && npm run scp-xys && npm run dec-xys && npm run remove_tar", |
| 19 | - "xys_upload": "npm run build_tar && npm run scp-xys && npm run dec-xys && npm run remove_tar && npm run remove_dist" | 19 | + "deploy": "bash scripts/deploy.sh" |
| 20 | }, | 20 | }, |
| 21 | "dependencies": { | 21 | "dependencies": { |
| 22 | "@vant/area-data": "^1.3.1", | 22 | "@vant/area-data": "^1.3.1", | ... | ... |
scripts/deploy.sh
0 → 100644
| 1 | +#!/usr/bin/env bash | ||
| 2 | +# | ||
| 3 | +# 部署脚本:构建项目 -> 上传七牛 -> 打包并上传到服务器 | ||
| 4 | +# 说明:在 macOS 环境下执行,依赖 npm、qshell、ssh/scp | ||
| 5 | + | ||
| 6 | +set -euo pipefail | ||
| 7 | + | ||
| 8 | +# 全局变量(按需修改) | ||
| 9 | +repo_root="$(cd "$(dirname "$0")/.." && pwd)" | ||
| 10 | +server_host="zhsy@oa.jcedu.org" | ||
| 11 | +server_port="12101" | ||
| 12 | +remote_dir="/home/www/f" | ||
| 13 | +local_tar="dist.tar.gz" | ||
| 14 | +local_package_dir="stdj" | ||
| 15 | +qshell_dir="$HOME/.qshell" | ||
| 16 | +qshell_conf="stdj_upload.conf" | ||
| 17 | +build_out_dir="dist" | ||
| 18 | + | ||
| 19 | +# 打印信息日志 | ||
| 20 | +# 说明:输出带前缀的日志,便于观察执行过程 | ||
| 21 | +log_info() { | ||
| 22 | + echo "[deploy] $1" | ||
| 23 | +} | ||
| 24 | + | ||
| 25 | +# 执行命令并显示日志 | ||
| 26 | +# 参数:cmd 命令字符串 | ||
| 27 | +# 说明:包装命令执行,便于统一错误处理与日志输出 | ||
| 28 | +run_cmd() { | ||
| 29 | + local cmd="$1" | ||
| 30 | + log_info "执行:$cmd" | ||
| 31 | + eval "$cmd" | ||
| 32 | +} | ||
| 33 | + | ||
| 34 | +# 检测构建输出目录 | ||
| 35 | +# 说明:按优先级读取 .env.production -> .env -> .env.development 中的 VITE_OUTDIR,缺省为 dist | ||
| 36 | +detect_out_dir() { | ||
| 37 | + # POSIX 兼容实现:按顺序检查 .env.production -> .env -> .env.development | ||
| 38 | + # 若未设置,回退为 dist | ||
| 39 | + local outdir="dist" | ||
| 40 | + for env_file in "$repo_root/.env.production" "$repo_root/.env" "$repo_root/.env.development"; do | ||
| 41 | + if [ -f "$env_file" ]; then | ||
| 42 | + # 提取键值:去注释、去空格、去引号 | ||
| 43 | + local value | ||
| 44 | + value=$(grep -E '^\s*VITE_OUTDIR\s*=' "$env_file" | head -n1 | cut -d '=' -f2- | sed 's/#.*$//' | tr -d '[:space:]' | sed -e 's/^"//;s/"$//' -e "s/^'//;s/'$//" || true) | ||
| 45 | + if [ -n "${value:-}" ]; then | ||
| 46 | + outdir="$value" | ||
| 47 | + break | ||
| 48 | + fi | ||
| 49 | + fi | ||
| 50 | + done | ||
| 51 | + echo "$outdir" | ||
| 52 | +} | ||
| 53 | + | ||
| 54 | +# 构建项目 | ||
| 55 | +# 说明:使用 npm 脚本进行构建,产物位于 dist/ | ||
| 56 | +build_project() { | ||
| 57 | + log_info "开始构建项目" | ||
| 58 | + cd "$repo_root" | ||
| 59 | + if command -v pnpm >/dev/null 2>&1; then | ||
| 60 | + run_cmd "pnpm run build" | ||
| 61 | + elif command -v npm >/dev/null 2>&1; then | ||
| 62 | + run_cmd "npm run build" | ||
| 63 | + elif command -v yarn >/dev/null 2>&1; then | ||
| 64 | + run_cmd "yarn build" | ||
| 65 | + else | ||
| 66 | + echo "错误:未检测到 pnpm/npm/yarn,请先安装其中之一" | ||
| 67 | + exit 1 | ||
| 68 | + fi | ||
| 69 | + build_out_dir="$(detect_out_dir)" | ||
| 70 | + if [ ! -d "$repo_root/${build_out_dir:-}" ]; then | ||
| 71 | + echo "错误:未找到构建输出目录 '${build_out_dir:-}/',请检查 .env/.env.production 的 VITE_OUTDIR 或构建是否成功" | ||
| 72 | + exit 1 | ||
| 73 | + fi | ||
| 74 | + log_info "构建完成:${build_out_dir:-}/" | ||
| 75 | +} | ||
| 76 | + | ||
| 77 | +# 准备打包目录 | ||
| 78 | +# 说明:将 dist 内容复制到 stdj 目录,用于后续打包 | ||
| 79 | +prepare_package_dir() { | ||
| 80 | + log_info "准备打包目录:$local_package_dir" | ||
| 81 | + cd "$repo_root" | ||
| 82 | + # 保留 stdj 目录,仅增量同步构建产物 | ||
| 83 | + run_cmd "mkdir -p '$local_package_dir'" | ||
| 84 | + if [ "${build_out_dir:-}" = "$local_package_dir" ]; then | ||
| 85 | + # 输出目录与包目录一致,直接使用,无需复制 | ||
| 86 | + log_info "输出目录与包目录一致:${build_out_dir:-},跳过复制" | ||
| 87 | + return 0 | ||
| 88 | + fi | ||
| 89 | + if command -v rsync >/dev/null 2>&1; then | ||
| 90 | + # 使用 rsync 增量复制,保留 stdj 目录和其他文件(不删除已有文件) | ||
| 91 | + run_cmd "rsync -a '${build_out_dir:-}/' '$local_package_dir/'" | ||
| 92 | + else | ||
| 93 | + # 回退到 cp -R,同样保留 stdj 目录 | ||
| 94 | + run_cmd "cp -R '${build_out_dir:-}'/. '$local_package_dir'/" | ||
| 95 | + fi | ||
| 96 | +} | ||
| 97 | + | ||
| 98 | +# 上传静态资源到七牛云 | ||
| 99 | +# 说明:进入 ~/.qshell 并执行 qupload,同步 upload.conf 中配置的资源 | ||
| 100 | +upload_qiniu() { | ||
| 101 | + log_info "检查 qshell 安装与配置" | ||
| 102 | + if ! command -v qshell >/dev/null 2>&1; then | ||
| 103 | + echo "错误:未检测到 qshell,请先安装 https://developer.qiniu.com/kodo/tools/1302/qshell" | ||
| 104 | + exit 1 | ||
| 105 | + fi | ||
| 106 | + if [ ! -d "$qshell_dir" ]; then | ||
| 107 | + echo "错误:未找到目录 $qshell_dir" | ||
| 108 | + exit 1 | ||
| 109 | + fi | ||
| 110 | + if [ ! -f "$qshell_dir/$qshell_conf" ]; then | ||
| 111 | + echo "错误:未找到七牛配置文件 $qshell_dir/$qshell_conf" | ||
| 112 | + exit 1 | ||
| 113 | + fi | ||
| 114 | + log_info "开始上传七牛云资源(qupload)" | ||
| 115 | + cd "$qshell_dir" | ||
| 116 | + # 说明:部分文件已存在会导致 qshell 返回非零退出码,此处不终止流程 | ||
| 117 | + log_info "执行:qshell qupload '$qshell_conf'" | ||
| 118 | + if ! qshell qupload "$qshell_conf"; then | ||
| 119 | + log_info "qshell qupload 退出码非零(可能因文件已存在),继续后续部署" | ||
| 120 | + fi | ||
| 121 | + log_info "七牛云资源上传完成" | ||
| 122 | +} | ||
| 123 | + | ||
| 124 | +# 打包本地目录并上传到服务器 | ||
| 125 | +# 说明:打包 stdj -> 通过 scp 上传到指定目录 -> 远端解压并删除压缩包 | ||
| 126 | +upload_server() { | ||
| 127 | + log_info "开始打包:${local_tar:-}" | ||
| 128 | + cd "$repo_root" | ||
| 129 | + run_cmd "tar -czvpf '${local_tar:-}' '${local_package_dir:-}'" | ||
| 130 | + | ||
| 131 | + log_info "上传到服务器:${server_host:-}:${remote_dir:-}(端口 ${server_port:-})" | ||
| 132 | + run_cmd "scp -P '${server_port:-}' '${local_tar:-}' '${server_host:-}':'${remote_dir:-}'" | ||
| 133 | + | ||
| 134 | + log_info "服务器解压:${remote_dir:-}/${local_tar:-}" | ||
| 135 | + # 说明:构造远端命令,避免变量名意外字符导致的未绑定错误 | ||
| 136 | + local remote_cmd | ||
| 137 | + remote_cmd="cd \"${remote_dir:-}\" && tar -xzvf \"${local_tar:-}\" && rm -rf \"${local_tar:-}\"" | ||
| 138 | + run_cmd "ssh -p '${server_port:-}' '${server_host:-}' \"$remote_cmd\"" | ||
| 139 | + | ||
| 140 | + log_info "删除本地压缩包" | ||
| 141 | + run_cmd "rm -f '${local_tar:-}'" | ||
| 142 | +} | ||
| 143 | + | ||
| 144 | +# 主流程 | ||
| 145 | +# 说明:串行执行:构建 -> 七牛上传 -> 服务器打包上传 | ||
| 146 | +main() { | ||
| 147 | + build_project | ||
| 148 | + prepare_package_dir | ||
| 149 | + upload_qiniu | ||
| 150 | + upload_server | ||
| 151 | + log_info "部署完成" | ||
| 152 | +} | ||
| 153 | + | ||
| 154 | +main "$@" |
-
Please register or login to post a comment