run.sh 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #!/bin/bash
  2. # 配置
  3. SOURCE_DIR="dist-prod" # 打包生成的源文件夹
  4. ZIP_NAME="dc.ifoodme.com.zip" # 输出的 ZIP 文件名
  5. TEMP_DIR="/tmp/dc.ifoodme.com" # 临时目录,用于构建目标结构
  6. TARGET_DIR="dc.ifoodme.com" # ZIP 中的目标目录名
  7. BUILD_CMD="pnpm run build:prod" # 打包命令
  8. # FTP 配置
  9. FTP_SERVER="104.233.167.88"
  10. FTP_PORT="21"
  11. FTP_USER="admin"
  12. # 这里替换成你的 FTP 用户名
  13. FTP_PASS="snF1szwjJZcJ"
  14. # 这里替换成你的 FTP 密码
  15. FTP_TARGET_DIR="/"
  16. # 颜色输出
  17. RED='\033[0;31m'
  18. GREEN='\033[0;32m'
  19. NC='\033[0m' # No Color
  20. # 捕获中断信号
  21. trap 'cleanup; exit 1' INT TERM
  22. # 检查命令是否存在
  23. command_exists() {
  24. command -v "$1" >/dev/null 2>&1
  25. }
  26. # 检查依赖
  27. check_dependencies() {
  28. for cmd in pnpm zip unzip curl; do
  29. if ! command_exists "$cmd"; then
  30. echo -e "${RED}错误:需要安装 $cmd${NC}"
  31. exit 1
  32. fi
  33. done
  34. }
  35. # 检查并删除旧 ZIP 文件
  36. check_and_remove_zip() {
  37. if [ -f "$ZIP_NAME" ]; then
  38. echo "检测到旧 ZIP 文件,删除中..."
  39. rm -f "$ZIP_NAME"
  40. echo -e "${GREEN}旧 ZIP 文件已删除${NC}"
  41. fi
  42. }
  43. # 执行打包
  44. run_build() {
  45. echo "开始执行打包: $BUILD_CMD..."
  46. if ! $BUILD_CMD; then
  47. echo -e "${RED}打包失败${NC}"
  48. exit 1
  49. fi
  50. echo -e "${GREEN}打包完成${NC}"
  51. }
  52. # 检查源文件夹
  53. check_source() {
  54. if [ ! -d "$SOURCE_DIR" ]; then
  55. echo -e "${RED}错误:源文件夹 $SOURCE_DIR 不存在${NC}"
  56. exit 1
  57. fi
  58. if [ ! -f "$SOURCE_DIR/index.html" ]; then
  59. echo -e "${RED}错误:$SOURCE_DIR 中没有 index.html 文件${NC}"
  60. exit 1
  61. fi
  62. }
  63. # 打包 ZIP
  64. create_zip() {
  65. echo "开始打包 ZIP..."
  66. rm -rf "$TEMP_DIR"
  67. mkdir -p "$TEMP_DIR"
  68. cp -r "$SOURCE_DIR"/* "$TEMP_DIR"
  69. mv "$TEMP_DIR" "$TARGET_DIR"
  70. zip -r "$ZIP_NAME" "$TARGET_DIR" >/dev/null
  71. if [ $? -eq 0 ]; then
  72. echo -e "${GREEN}打包成功:$ZIP_NAME${NC}"
  73. else
  74. echo -e "${RED}打包失败${NC}"
  75. exit 1
  76. fi
  77. }
  78. # FTP 上传
  79. upload_ftp() {
  80. echo "开始上传文件到 FTP 服务器 $FTP_SERVER:$FTP_PORT ..."
  81. curl --max-time 300 --retry 3 -T "$ZIP_NAME" --ftp-create-dirs -u "$FTP_USER:$FTP_PASS" "ftp://$FTP_SERVER:$FTP_PORT$FTP_TARGET_DIR/$ZIP_NAME"
  82. if [ $? -eq 0 ]; then
  83. echo -e "${GREEN}文件上传成功:$FTP_TARGET_DIR/$ZIP_NAME${NC}"
  84. else
  85. echo -e "${RED}文件上传失败${NC}"
  86. exit 1
  87. fi
  88. }
  89. # 测试解压(可选)
  90. test_unzip() {
  91. echo "测试解压..."
  92. mkdir -p test_unzip
  93. unzip -o "$ZIP_NAME" -d test_unzip >/dev/null
  94. if [ -f "test_unzip/$TARGET_DIR/index.html" ]; then
  95. echo -e "${GREEN}解压测试成功:test_unzip/$TARGET_DIR/index.html 存在${NC}"
  96. else
  97. echo -e "${RED}解压测试失败:未生成正确的目录结构${NC}"
  98. exit 1
  99. fi
  100. }
  101. trigger_jenkins() {
  102. JENKINS_URL="https://code.ifoodme.com/job/online-order-vue"
  103. JENKINS_TOKEN="11d3ef87866e3756c131425ef09d705002"
  104. USERNAME="wangyibu123"
  105. echo "触发 Jenkins 任务..."
  106. # 触发构建并获取队列位置
  107. QUEUE_URL=$(curl -s -X POST "$JENKINS_URL/build" \
  108. --user "$USERNAME:$JENKINS_TOKEN" \
  109. -H "Jenkins-Crumb: $(curl -s "$JENKINS_URL/crumbIssuer/api/xml" --user "$USERNAME:$JENKINS_TOKEN" | sed -n 's/.*<crumb>\(.*\)<\/crumb>.*/\1/p')" \
  110. -I | grep -i "Location:" | awk '{print $2}' | tr -d '\r')
  111. if [ -z "$QUEUE_URL" ]; then
  112. echo -e "\033[ tay31mJenkins 任务触发失败\033[0m"
  113. exit 1
  114. fi
  115. echo "等待任务进入构建队列..."
  116. # 等待获取构建号
  117. while true; do
  118. BUILD_URL=$(curl -s "$QUEUE_URL/api/json" --user "$USERNAME:$JENKINS_TOKEN" | jq -r '.executable.url // ""')
  119. if [ -n "$BUILD_URL" ]; then
  120. BUILD_NUMBER=$(basename "$BUILD_URL")
  121. echo "任务开始构建,构建号: $BUILD_NUMBER"
  122. break
  123. fi
  124. sleep 5
  125. done
  126. echo "等待任务完成..."
  127. # 监控构建状态
  128. while true; do
  129. STATUS=$(curl -s "$BUILD_URL/api/json" --user "$USERNAME:$JENKINS_TOKEN" | jq -r '.result // "RUNNING"')
  130. if [ "$STATUS" != "RUNNING" ] && [ "$STATUS" != "null" ]; then
  131. if [ "$STATUS" == "SUCCESS" ]; then
  132. echo -e "\033[32mJenkins 任务完成 - 成功\033[0m"
  133. # 获取并返回构建结果
  134. curl -s "$BUILD_URL/consoleText" --user "$USERNAME:$JENKINS_TOKEN"
  135. return 0
  136. else
  137. echo -e "\033[31mJenkins 任务完成 - 失败 ($STATUS)\033[0m"
  138. curl -s "$BUILD_URL/consoleText" --user "$USERNAME:$JENKINS_TOKEN"
  139. return 1
  140. fi
  141. fi
  142. sleep 10
  143. done
  144. }
  145. # 清理
  146. cleanup() {
  147. echo "清理临时文件..."
  148. rm -rf "$TARGET_DIR" test_unzip
  149. echo -e "${GREEN}清理完成${NC}"
  150. }
  151. # 主函数
  152. main() {
  153. check_dependencies
  154. check_and_remove_zip # 先检查并删除旧的 ZIP 文件
  155. run_build
  156. check_source
  157. create_zip
  158. test_unzip
  159. upload_ftp
  160. cleanup
  161. trigger_jenkins
  162. echo -e "${GREEN}所有任务完成!${NC}"
  163. }
  164. # 执行
  165. main