fix(ci): 使用独立脚本处理rsync同步,避免YAML引号问题
ci/woodpecker/push/woodpecker Pipeline failed

根本原因:
Woodpecker CI在处理包含双引号的YAML字符串时存在引号处理问题,
导致shell接收到格式错误的命令,出现'unterminated quoted string'错误。

解决方案:
1. 创建scripts/sync-to-production.sh脚本封装所有rsync操作
2. 在.woodpecker.yml中调用脚本而非直接写复杂命令
3. 简化ssh命令中的条件判断语法

优势:
- 避免YAML引号嵌套问题
- 脚本更易维护和调试
- 清晰的部署流程分离
This commit is contained in:
张翔
2026-04-01 10:56:54 +08:00
parent 8e6f91629c
commit 2b1b105caa
2 changed files with 37 additions and 7 deletions
+3 -7
View File
@@ -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
+34
View File
@@ -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 "✅ 所有构建产物已成功同步到生产服务器"