admin_front_deploy_bak.sh 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. #!/bin/bash
  2. # =============================================
  3. # Vue前端应用自动部署脚本
  4. # 功能:备份当前部署文件,部署新版本到nginx
  5. # =============================================
  6. # 设置颜色输出
  7. RED='\033[0;31m'
  8. GREEN='\033[0;32m'
  9. YELLOW='\033[1;33m'
  10. NC='\033[0m' # No Color
  11. # 日志函数
  12. log_info() {
  13. echo -e "${GREEN}[INFO] $1${NC}"
  14. }
  15. log_warn() {
  16. echo -e "${YELLOW}[WARN] $1${NC}"
  17. }
  18. log_error() {
  19. echo -e "${RED}[ERROR] $1${NC}"
  20. }
  21. # 定义目录变量
  22. put_tmp_directory="/home/lq/lq_workspace/deploy_workspace/put" # 部署临时目录(存放新版本的dist-dev.zip)
  23. nginx_html_directory="/home/lq/nginx/html" # nginx部署目录
  24. nginx_html_bak="/home/lq/lq_workspace/deploy_workspace/deploy_bak/LQAdminFrontServer" # 备份目录
  25. # 处理参数
  26. if [ $# -eq 0 ]; then
  27. # 如果没有传入参数,使用默认文件名
  28. SOURCE_ZIP="$put_tmp_directory/dist-dev.zip"
  29. log_info "未指定部署文件,将使用默认文件: $SOURCE_ZIP"
  30. # 检查默认文件是否存在
  31. if [ ! -f "$SOURCE_ZIP" ]; then
  32. log_error "默认文件 $SOURCE_ZIP 不存在于当前目录"
  33. echo "当前目录: $(pwd)"
  34. echo "请指定要部署的zip文件路径,或者将dist-dev.zip放在当前目录"
  35. echo ""
  36. echo "使用方法:"
  37. echo " 1. 不传参数: $0 (使用当前目录的dist-dev.zip)"
  38. echo " 2. 传入参数: $0 <zip文件路径> (使用指定路径的zip文件)"
  39. echo ""
  40. echo "示例:"
  41. echo " $0 # 使用当前目录的dist-dev.zip"
  42. echo " $0 /home/user/dist-dev.zip # 使用指定路径的文件"
  43. echo " $0 /home/user/vue-app.zip # 使用其他名称的zip文件"
  44. exit 1
  45. fi
  46. else
  47. # 使用传入的参数
  48. SOURCE_ZIP="$put_tmp_directory/$1"
  49. log_info "使用指定的部署文件: $SOURCE_ZIP"
  50. fi
  51. # 检查源文件是否存在
  52. if [ ! -f "$SOURCE_ZIP" ]; then
  53. log_error "文件不存在: $SOURCE_ZIP"
  54. exit 1
  55. fi
  56. # 检查文件是否是zip格式
  57. if ! file "$SOURCE_ZIP" | grep -q "Zip archive"; then
  58. log_error "文件不是有效的zip压缩包: $SOURCE_ZIP"
  59. exit 1
  60. fi
  61. # 检查目录是否存在,不存在则创建
  62. check_and_create_dir() {
  63. if [ ! -d "$1" ]; then
  64. log_warn "目录不存在,正在创建: $1"
  65. mkdir -p "$1"
  66. if [ $? -eq 0 ]; then
  67. log_info "目录创建成功: $1"
  68. else
  69. log_error "目录创建失败: $1"
  70. exit 1
  71. fi
  72. fi
  73. }
  74. # 检查并创建所有需要的目录
  75. log_info "检查并创建目录..."
  76. check_and_create_dir "$put_tmp_directory"
  77. check_and_create_dir "$nginx_html_bak"
  78. check_and_create_dir "$nginx_html_directory"
  79. # 清理临时目录中的旧文件
  80. #log_info "清理临时目录..."
  81. #rm -f "$put_tmp_directory"/*.zip 2>/dev/null
  82. # 检查nginx部署目录是否为空
  83. if [ ! -d "$nginx_html_directory" ] || [ -z "$(ls -A $nginx_html_directory 2>/dev/null)" ]; then
  84. log_warn "nginx部署目录为空或不存在,跳过备份步骤"
  85. SKIP_BACKUP=true
  86. else
  87. SKIP_BACKUP=false
  88. fi
  89. # 获取当前时间(用于备份文件名)
  90. current_time=$(date "+%Y-%m-%d_%H-%M-%S")
  91. backup_filename="dist-dev_bak_${current_time}.zip"
  92. backup_filepath="/tmp/${backup_filename}"
  93. # ========== 2.1 备份当前部署文件 ==========
  94. if [ "$SKIP_BACKUP" = false ]; then
  95. log_info "正在备份当前部署文件..."
  96. # 切换到nginx部署目录
  97. cd "$nginx_html_directory" || {
  98. log_error "无法切换到nginx部署目录: $nginx_html_directory"
  99. exit 1
  100. }
  101. # 检查是否有需要备份的文件
  102. if [ ! -f "index.html" ] && [ ! -d "assets" ]; then
  103. log_warn "未找到index.html和assets目录,跳过备份"
  104. SKIP_BACKUP=true
  105. else
  106. # 创建备份压缩包
  107. log_info "正在创建备份文件: $backup_filename"
  108. if command -v zip >/dev/null 2>&1; then
  109. # 只备份index.html和assets目录
  110. if [ -f "index.html" ]; then
  111. zip -qr "$backup_filepath" index.html
  112. log_info "已备份 index.html"
  113. fi
  114. if [ -d "assets" ]; then
  115. zip -qru "$backup_filepath" assets
  116. log_info "已备份 assets 目录"
  117. fi
  118. if [ ! -f "$backup_filepath" ]; then
  119. log_error "备份文件创建失败"
  120. exit 1
  121. fi
  122. backup_size=$(du -h "$backup_filepath" | cut -f1)
  123. log_info "备份完成,文件大小: $backup_size"
  124. else
  125. log_error "未找到zip命令,请先安装zip工具"
  126. log_info "安装命令: sudo apt-get install zip 或 sudo yum install zip"
  127. exit 1
  128. fi
  129. fi
  130. fi
  131. # ========== 2.2 复制备份文件到备份目录 ==========
  132. if [ "$SKIP_BACKUP" = false ] && [ -f "$backup_filepath" ]; then
  133. log_info "正在复制备份文件到备份目录..."
  134. cp "$backup_filepath" "$nginx_html_bak/"
  135. if [ $? -eq 0 ]; then
  136. log_info "备份文件已保存到: $nginx_html_bak/$backup_filename"
  137. else
  138. log_error "备份文件复制失败"
  139. exit 1
  140. fi
  141. fi
  142. # ========== 2.3 删除工作目录下的备份文件 ==========
  143. if [ -f "$backup_filepath" ]; then
  144. log_info "清理临时备份文件..."
  145. rm -f "$backup_filepath"
  146. log_info "临时备份文件已清理"
  147. fi
  148. # ========== 2.4 复制新的dist-dev.zip到nginx部署目录 ==========
  149. log_info "正在复制新版本文件到nginx部署目录..."
  150. cp "$SOURCE_ZIP" "$nginx_html_directory/dist-dev.zip"
  151. if [ $? -ne 0 ]; then
  152. log_error "文件复制失败"
  153. exit 1
  154. fi
  155. log_info "新版本文件已复制到: $nginx_html_directory/dist-dev.zip"
  156. # ========== 2.5 解压缩并清理 ==========
  157. log_info "正在解压缩新版本文件..."
  158. # 切换到nginx部署目录
  159. cd "$nginx_html_directory" || {
  160. log_error "无法切换到nginx部署目录"
  161. exit 1
  162. }
  163. # 先删除现有的文件 再解压
  164. rm -f index.html && rm -rf assets
  165. log_info "删除nginx工作目录的文件"
  166. # 检查unzip命令
  167. if ! command -v unzip >/dev/null 2>&1; then
  168. log_error "未找到unzip命令,请先安装unzip工具"
  169. log_info "安装命令: sudo apt-get install unzip 或 sudo yum install unzip"
  170. exit 1
  171. fi
  172. # 解压缩前备份现有文件(如果需要)
  173. if [ "$SKIP_BACKUP" = false ]; then
  174. # 移动现有文件到临时目录
  175. temp_backup_dir="/tmp/nginx_html_backup_${current_time}"
  176. mkdir -p "$temp_backup_dir"
  177. # 移动除dist-dev.zip之外的所有文件
  178. for item in *; do
  179. if [ "$item" != "dist-dev.zip" ]; then
  180. mv "$item" "$temp_backup_dir/" 2>/dev/null || true
  181. fi
  182. done
  183. log_info "现有文件已临时备份到: $temp_backup_dir"
  184. fi
  185. # 解压缩文件
  186. log_info "正在解压dist-dev.zip..."
  187. unzip -o -q "dist-dev.zip"
  188. if [ $? -eq 0 ]; then
  189. log_info "解压缩完成"
  190. # 检查解压后的文件
  191. if [ -f "index.html" ]; then
  192. log_info "✓ index.html 文件存在"
  193. else
  194. log_warn "⚠ 解压后未找到index.html文件"
  195. fi
  196. if [ -d "assets" ]; then
  197. assets_count=$(find assets -type f | wc -l)
  198. log_info "✓ assets 目录存在,包含 $assets_count 个文件"
  199. else
  200. log_warn "⚠ 解压后未找到assets目录"
  201. fi
  202. else
  203. log_error "解压缩失败"
  204. # 如果解压失败,恢复备份的文件
  205. if [ "$SKIP_BACKUP" = false ] && [ -d "$temp_backup_dir" ]; then
  206. log_info "正在恢复备份文件..."
  207. mv "$temp_backup_dir"/* . 2>/dev/null || true
  208. fi
  209. exit 1
  210. fi
  211. # ========== 清理临时文件和目录 ==========
  212. log_info "正在清理临时文件..."
  213. # 删除zip文件
  214. rm -f "$nginx_html_directory/dist-dev.zip"
  215. log_info "已删除dist-dev.zip文件"
  216. # 删除临时备份目录
  217. if [ -d "$temp_backup_dir" ]; then
  218. rm -rf "$temp_backup_dir"
  219. log_info "已清理临时备份目录"
  220. fi
  221. # 设置正确的权限
  222. log_info "设置文件权限..."
  223. chmod -R 755 "$nginx_html_directory" 2>/dev/null || true
  224. # 验证部署
  225. log_info "==================== 部署验证 ===================="
  226. log_info "部署目录: $nginx_html_directory"
  227. log_info "备份目录: $nginx_html_bak"
  228. log_info "部署时间: $(date)"
  229. log_info "备份文件: ${backup_filename:-无}"
  230. # 显示目录结构
  231. log_info "当前部署文件结构:"
  232. ls -la "$nginx_html_directory" | head -20
  233. log_info "=================================================="
  234. # 获取文件数量统计
  235. html_count=$(find "$nginx_html_directory" -name "*.html" -type f | wc -l)
  236. js_count=$(find "$nginx_html_directory" -name "*.js" -type f | wc -l)
  237. css_count=$(find "$nginx_html_directory" -name "*.css" -type f | wc -l)
  238. log_info "部署统计:"
  239. log_info " HTML文件: $html_count 个"
  240. log_info " JS文件: $js_count 个"
  241. log_info " CSS文件: $css_count 个"
  242. if [ "$SKIP_BACKUP" = false ]; then
  243. log_info " 🔄 备份已创建: $nginx_html_bak/$backup_filename"
  244. fi
  245. log_info "${GREEN}✅ Vue前端应用部署完成!${NC}"
  246. # 输出nginx重启建议
  247. log_info "=================================================="
  248. log_info "如果需要重新加载nginx配置,请执行以下命令:"
  249. echo "sudo nginx -s reload"
  250. log_info "=================================================="