#!/bin/bash # 配置 SOURCE_DIR="dist-prod" # 打包生成的源文件夹 ZIP_NAME="dc.ifoodme.com.zip" # 输出的 ZIP 文件名 TEMP_DIR="/tmp/dc.ifoodme.com" # 临时目录,用于构建目标结构 TARGET_DIR="dc.ifoodme.com" # ZIP 中的目标目录名 BUILD_CMD="pnpm run build:prod" # 打包命令 # FTP 配置 FTP_SERVER="104.233.167.88" FTP_PORT="21" FTP_USER="admin" # 这里替换成你的 FTP 用户名 FTP_PASS="snF1szwjJZcJ" # 这里替换成你的 FTP 密码 FTP_TARGET_DIR="/" # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' NC='\033[0m' # No Color # 捕获中断信号 trap 'cleanup; exit 1' INT TERM # 检查命令是否存在 command_exists() { command -v "$1" >/dev/null 2>&1 } # 检查依赖 check_dependencies() { for cmd in pnpm zip unzip curl; do if ! command_exists "$cmd"; then echo -e "${RED}错误:需要安装 $cmd${NC}" exit 1 fi done } # 检查并删除旧 ZIP 文件 check_and_remove_zip() { if [ -f "$ZIP_NAME" ]; then echo "检测到旧 ZIP 文件,删除中..." rm -f "$ZIP_NAME" echo -e "${GREEN}旧 ZIP 文件已删除${NC}" fi } # 执行打包 run_build() { echo "开始执行打包: $BUILD_CMD..." if ! $BUILD_CMD; then echo -e "${RED}打包失败${NC}" exit 1 fi echo -e "${GREEN}打包完成${NC}" } # 检查源文件夹 check_source() { if [ ! -d "$SOURCE_DIR" ]; then echo -e "${RED}错误:源文件夹 $SOURCE_DIR 不存在${NC}" exit 1 fi if [ ! -f "$SOURCE_DIR/index.html" ]; then echo -e "${RED}错误:$SOURCE_DIR 中没有 index.html 文件${NC}" exit 1 fi } # 打包 ZIP create_zip() { echo "开始打包 ZIP..." rm -rf "$TEMP_DIR" mkdir -p "$TEMP_DIR" cp -r "$SOURCE_DIR"/* "$TEMP_DIR" mv "$TEMP_DIR" "$TARGET_DIR" zip -r "$ZIP_NAME" "$TARGET_DIR" >/dev/null if [ $? -eq 0 ]; then echo -e "${GREEN}打包成功:$ZIP_NAME${NC}" else echo -e "${RED}打包失败${NC}" exit 1 fi } # FTP 上传 upload_ftp() { echo "开始上传文件到 FTP 服务器 $FTP_SERVER:$FTP_PORT ..." 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" if [ $? -eq 0 ]; then echo -e "${GREEN}文件上传成功:$FTP_TARGET_DIR/$ZIP_NAME${NC}" else echo -e "${RED}文件上传失败${NC}" exit 1 fi } # 测试解压(可选) test_unzip() { echo "测试解压..." mkdir -p test_unzip unzip -o "$ZIP_NAME" -d test_unzip >/dev/null if [ -f "test_unzip/$TARGET_DIR/index.html" ]; then echo -e "${GREEN}解压测试成功:test_unzip/$TARGET_DIR/index.html 存在${NC}" else echo -e "${RED}解压测试失败:未生成正确的目录结构${NC}" exit 1 fi } trigger_jenkins() { JENKINS_URL="https://code.ifoodme.com/job/online-order-vue" JENKINS_TOKEN="11edd2e1f90a5bb386d7c3ae45c32a1e39" USERNAME="robot" echo "触发 Jenkins 任务..." # 触发构建并获取队列位置 QUEUE_URL=$(curl -s -X POST "$JENKINS_URL/build" \ --user "$USERNAME:$JENKINS_TOKEN" \ -H "Jenkins-Crumb: $(curl -s "$JENKINS_URL/crumbIssuer/api/xml" --user "$USERNAME:$JENKINS_TOKEN" | sed -n 's/.*\(.*\)<\/crumb>.*/\1/p')" \ -I | grep -i "Location:" | awk '{print $2}' | tr -d '\r') if [ -z "$QUEUE_URL" ]; then echo -e "\033[ tay31mJenkins 任务触发失败\033[0m" exit 1 fi echo "等待任务进入构建队列..." # 等待获取构建号 while true; do BUILD_URL=$(curl -s "$QUEUE_URL/api/json" --user "$USERNAME:$JENKINS_TOKEN" | jq -r '.executable.url // ""') if [ -n "$BUILD_URL" ]; then BUILD_NUMBER=$(basename "$BUILD_URL") echo "任务开始构建,构建号: $BUILD_NUMBER" break fi sleep 5 done echo "等待任务完成..." # 监控构建状态 while true; do STATUS=$(curl -s "$BUILD_URL/api/json" --user "$USERNAME:$JENKINS_TOKEN" | jq -r '.result // "RUNNING"') if [ "$STATUS" != "RUNNING" ] && [ "$STATUS" != "null" ]; then if [ "$STATUS" == "SUCCESS" ]; then echo -e "\033[32mJenkins 任务完成 - 成功\033[0m" # 获取并返回构建结果 curl -s "$BUILD_URL/consoleText" --user "$USERNAME:$JENKINS_TOKEN" return 0 else echo -e "\033[31mJenkins 任务完成 - 失败 ($STATUS)\033[0m" curl -s "$BUILD_URL/consoleText" --user "$USERNAME:$JENKINS_TOKEN" return 1 fi fi sleep 10 done } # 清理 cleanup() { echo "清理临时文件..." rm -rf "$TARGET_DIR" test_unzip echo -e "${GREEN}清理完成${NC}" } # 主函数 main() { check_dependencies check_and_remove_zip # 先检查并删除旧的 ZIP 文件 run_build check_source create_zip test_unzip upload_ftp cleanup trigger_jenkins echo -e "${GREEN}所有任务完成!${NC}" } # 执行 main