hookehuyr

feat(deploy): 添加自动部署脚本并更新相关配置

添加部署脚本 scripts/deploy.sh 实现一键部署流程
更新 package.json 添加 deploy 命令
修改 .env.production 中的资源路径为 CDN 地址
更新 README.md 添加部署脚本使用说明
1 ### 1 ###
2 # 资源公共路径 2 # 资源公共路径
3 -VITE_BASE = /f/stdj/ 3 +VITE_BASE = https://cdn.ipadbiz.cn/stdj/html_resource
4 4
5 # 测试open-id 5 # 测试open-id
6 VITE_APP_OPENID = 6 VITE_APP_OPENID =
......
...@@ -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",
......
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 "$@"