From 2b1b105caa8a261921adeb9496b58144168f5051 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=BF=94?= Date: Wed, 1 Apr 2026 10:56:54 +0800 Subject: [PATCH] =?UTF-8?q?fix(ci):=20=E4=BD=BF=E7=94=A8=E7=8B=AC=E7=AB=8B?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E5=A4=84=E7=90=86rsync=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=EF=BC=8C=E9=81=BF=E5=85=8DYAML=E5=BC=95=E5=8F=B7=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根本原因: Woodpecker CI在处理包含双引号的YAML字符串时存在引号处理问题, 导致shell接收到格式错误的命令,出现'unterminated quoted string'错误。 解决方案: 1. 创建scripts/sync-to-production.sh脚本封装所有rsync操作 2. 在.woodpecker.yml中调用脚本而非直接写复杂命令 3. 简化ssh命令中的条件判断语法 优势: - 避免YAML引号嵌套问题 - 脚本更易维护和调试 - 清晰的部署流程分离 --- .woodpecker.yml | 10 +++------- scripts/sync-to-production.sh | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 7 deletions(-) create mode 100755 scripts/sync-to-production.sh diff --git a/.woodpecker.yml b/.woodpecker.yml index 09dbd0f..36bdf7d 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -146,13 +146,9 @@ steps: - ssh -o StrictHostKeyChecking=no root@139.155.109.62 "echo Server connection OK" - ssh -o StrictHostKeyChecking=no root@139.155.109.62 "df -h / /home | head -3" - echo "Syncing build artifacts to production server" - - "rsync -avz --delete -e \"ssh -o StrictHostKeyChecking=no\" dist/ root@139.155.109.62:/home/novalon/docker-app/novalon-website/dist/" - - "rsync -avz -e \"ssh -o StrictHostKeyChecking=no\" public/ root@139.155.109.62:/home/novalon/docker-app/novalon-website/public/" - - "rsync -avz -e \"ssh -o StrictHostKeyChecking=no\" package.json package-lock.json root@139.155.109.62:/home/novalon/docker-app/novalon-website/" - - "rsync -avz -e \"ssh -o StrictHostKeyChecking=no\" Dockerfile.prod docker-compose.server.yml root@139.155.109.62:/home/novalon/docker-app/novalon-website/" - - "rsync -avz -e \"ssh -o StrictHostKeyChecking=no\" scripts/deploy-production.sh root@139.155.109.62:/home/novalon/docker-app/novalon-website/scripts/" - - "if [ -f .env.production ]; then rsync -avz -e \"ssh -o StrictHostKeyChecking=no\" .env.production root@139.155.109.62:/home/novalon/docker-app/novalon-website/; else echo \"No .env.production file\"; fi" - - "ssh -o StrictHostKeyChecking=no root@139.155.109.62 \"cd /home/novalon/docker-app/novalon-website && [ -f docker-compose.server.yml ] && mv docker-compose.server.yml docker-compose.yml; chmod +x scripts/deploy-production.sh && ./scripts/deploy-production.sh\"" + - chmod +x scripts/sync-to-production.sh + - ./scripts/sync-to-production.sh + - ssh -o StrictHostKeyChecking=no root@139.155.109.62 "cd /home/novalon/docker-app/novalon-website && test -f docker-compose.server.yml && mv docker-compose.server.yml docker-compose.yml; chmod +x scripts/deploy-production.sh && ./scripts/deploy-production.sh" - echo "Production deployment completed" volumes: - /tmp/npm-cache:/root/.npm diff --git a/scripts/sync-to-production.sh b/scripts/sync-to-production.sh new file mode 100755 index 0000000..a05bbc4 --- /dev/null +++ b/scripts/sync-to-production.sh @@ -0,0 +1,34 @@ +#!/bin/bash +set -e + +SERVER="root@139.155.109.62" +DEPLOY_PATH="/home/novalon/docker-app/novalon-website" +SSH_OPTS="-o StrictHostKeyChecking=no" + +echo "=== 同步构建产物到生产服务器 ===" + +echo "1. 同步dist目录..." +rsync -avz --delete -e "ssh $SSH_OPTS" dist/ ${SERVER}:${DEPLOY_PATH}/dist/ + +echo "2. 同步public目录..." +rsync -avz -e "ssh $SSH_OPTS" public/ ${SERVER}:${DEPLOY_PATH}/public/ + +echo "3. 同步package文件..." +rsync -avz -e "ssh $SSH_OPTS" package.json package-lock.json ${SERVER}:${DEPLOY_PATH}/ + +echo "4. 同步Docker配置..." +rsync -avz -e "ssh $SSH_OPTS" Dockerfile.prod docker-compose.server.yml ${SERVER}:${DEPLOY_PATH}/ + +echo "5. 同步部署脚本..." +rsync -avz -e "ssh $SSH_OPTS" scripts/deploy-production.sh ${SERVER}:${DEPLOY_PATH}/scripts/ + +echo "6. 同步环境配置(如果存在)..." +if [ -f .env.production ]; then + rsync -avz -e "ssh $SSH_OPTS" .env.production ${SERVER}:${DEPLOY_PATH}/ + echo "✅ .env.production已同步" +else + echo "⚠️ 没有.env.production文件" +fi + +echo "" +echo "✅ 所有构建产物已成功同步到生产服务器"