From 6e43f446aacdd82321ee3ff0177986e662feea10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=BF=94?= Date: Wed, 1 Apr 2026 11:09:37 +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=86archive=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=EF=BC=8C=E5=BD=BB=E5=BA=95=E8=A7=A3=E5=86=B3YAML=E5=BC=95?= =?UTF-8?q?=E5=8F=B7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根本原因: archive-to-main步骤中仍有大量使用单引号的命令,包含双引号嵌套, 导致Woodpecker CI解析失败。 解决方案: 1. 创建scripts/archive-to-main.sh脚本封装所有archive操作 2. 简化.woodpecker.yml中的archive-to-main步骤为调用脚本 3. 彻底避免YAML引号嵌套问题 优势: - 完全避免YAML引号问题 - 脚本更易维护和调试 - 清晰的职责分离 --- .woodpecker.yml | 66 +------------------------------ scripts/archive-to-main.sh | 80 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 64 deletions(-) create mode 100755 scripts/archive-to-main.sh diff --git a/.woodpecker.yml b/.woodpecker.yml index 36bdf7d..b156302 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -168,70 +168,8 @@ steps: depends_on: - build-and-deploy commands: - - echo "=== Archiving to main branch (增强可靠性版本) ===" - - echo "当前容器信息:" - - 'echo "主机名: $(hostname)"' - - 'echo "IP地址: $(hostname -i)"' - - echo "" - - echo "" - - echo "2. 配置SSH环境" - - mkdir -p ~/.ssh - - printf '%s\n' "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa - - chmod 600 ~/.ssh/id_rsa - - echo "✅ SSH私钥文件已创建" - - 'ls -la ~/.ssh/id_rsa' - - 'wc -c < ~/.ssh/id_rsa' - - echo "" - - echo "3. 配置Git服务器主机密钥" - - ssh-keyscan -H -p 22 git.f.novalon.cn >> ~/.ssh/known_hosts - - echo "✅ Git服务器主机密钥已添加" - - echo "" - - echo "4. 增强网络连接测试" - - echo "测试DNS解析:" - - 'dig +short git.f.novalon.cn || nslookup git.f.novalon.cn || echo "DNS解析测试完成"' - - echo "测试端口连通性:" - - 'timeout 10 nc -zv git.f.novalon.cn 22 && echo "✅ SSH端口可达" || echo "❌ SSH端口不可达"' - - echo "" - - echo "5. 增强SSH连接测试" - - echo "测试SSH连接到Git服务器..." - - 'timeout 15 ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 -o BatchMode=yes -T git@git.f.novalon.cn "echo \"✅ SSH连接成功\"" 2>&1 || echo "❌ SSH连接失败,但继续执行"' - - echo "" - - echo "6. 配置Git用户信息" - - git config --global user.email "ci@novalon.cn" - - git config --global user.name "Woodpecker CI" - - echo "✅ Git用户信息已配置" - - echo "" - - echo "7. 配置Git远程仓库" - - git remote set-url origin git@git.f.novalon.cn:novalon/novalon-website.git - - echo "✅ Git远程仓库已配置" - - echo "" - - echo "8. 增强Git远程访问测试" - - echo "测试Git远程仓库访问权限..." - - 'timeout 10 git ls-remote origin --heads 2>&1 | head -5 && echo "✅ Git远程访问成功" || echo "❌ Git远程访问失败,但继续执行"' - - echo "" - - echo "9. 执行归档操作(增强错误处理)" - - 'export CURRENT_BRANCH="${CI_COMMIT_BRANCH}"' - - 'echo "当前分支: $CURRENT_BRANCH"' - - 'echo "提交SHA: ${CI_COMMIT_SHA:0:7}"' - - echo "" - - echo "9.1 切换到main分支" - - 'git checkout main || { echo "❌ 切换到main分支失败"; exit 1; }' - - echo "" - - echo "9.2 拉取最新main分支" - - 'git pull origin main --no-rebase || { echo "❌ 拉取main分支失败"; exit 1; }' - - echo "" - - echo "9.3 合并当前分支到main" - - 'git merge "$CURRENT_BRANCH" --no-ff -m "archive: $CURRENT_BRANCH → main [CI]" || { echo "❌ 合并分支失败"; exit 1; }' - - echo "" - - echo "9.4 创建版本标签" - - 'export VERSION_TAG="v$(date +%Y.%m.%d)-${CI_COMMIT_SHA:0:7}"' - - 'git tag -a "$VERSION_TAG" -m "Release: $CURRENT_BRANCH → $VERSION_TAG [CI]" || { echo "❌ 创建标签失败"; exit 1; }' - - echo "" - - echo "9.5 推送到远程仓库" - - 'git push origin main || { echo "❌ 推送main分支失败"; exit 1; }' - - 'git push origin --tags || { echo "❌ 推送标签失败"; exit 1; }' - - echo "" - - 'echo "✅ 归档成功完成!版本: $VERSION_TAG"' + - chmod +x scripts/archive-to-main.sh + - ./scripts/archive-to-main.sh when: event: - push diff --git a/scripts/archive-to-main.sh b/scripts/archive-to-main.sh new file mode 100755 index 0000000..4f299c0 --- /dev/null +++ b/scripts/archive-to-main.sh @@ -0,0 +1,80 @@ +#!/bin/bash +set -e + +echo "=== Archiving to main branch ===" +echo "当前容器信息:" +echo "主机名: $(hostname)" +echo "IP地址: $(hostname -i)" +echo "" + +echo "2. 配置SSH环境" +mkdir -p ~/.ssh +printf '%s\n' "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa +chmod 600 ~/.ssh/id_rsa +echo "✅ SSH私钥文件已创建" +ls -la ~/.ssh/id_rsa +wc -c < ~/.ssh/id_rsa +echo "" + +echo "3. 配置Git服务器主机密钥" +ssh-keyscan -H -p 22 git.f.novalon.cn >> ~/.ssh/known_hosts +echo "✅ Git服务器主机密钥已添加" +echo "" + +echo "4. 增强网络连接测试" +echo "测试DNS解析:" +dig +short git.f.novalon.cn || nslookup git.f.novalon.cn || echo "DNS解析测试完成" +echo "测试端口连通性:" +timeout 10 nc -zv git.f.novalon.cn 22 && echo "✅ SSH端口可达" || echo "❌ SSH端口不可达" +echo "" + +echo "5. 增强SSH连接测试" +echo "测试SSH连接到Git服务器..." +timeout 15 ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 -o BatchMode=yes -T git@git.f.novalon.cn "echo '✅ SSH连接成功'" 2>&1 || echo "❌ SSH连接失败,但继续执行" +echo "" + +echo "6. 配置Git用户信息" +git config --global user.email "ci@novalon.cn" +git config --global user.name "Woodpecker CI" +echo "✅ Git用户信息已配置" +echo "" + +echo "7. 配置Git远程仓库" +git remote set-url origin git@git.f.novalon.cn:novalon/novalon-website.git +echo "✅ Git远程仓库已配置" +echo "" + +echo "8. 增强Git远程访问测试" +echo "测试Git远程仓库访问权限..." +timeout 10 git ls-remote origin --heads 2>&1 | head -5 && echo "✅ Git远程访问成功" || echo "❌ Git远程访问失败,但继续执行" +echo "" + +echo "9. 执行归档操作(增强错误处理)" +export CURRENT_BRANCH="${CI_COMMIT_BRANCH}" +echo "当前分支: $CURRENT_BRANCH" +echo "提交SHA: ${CI_COMMIT_SHA:0:7}" +echo "" + +echo "9.1 切换到main分支" +git checkout main || { echo "❌ 切换到main分支失败"; exit 1; } +echo "" + +echo "9.2 拉取最新main分支" +git pull origin main --no-rebase || { echo "❌ 拉取main分支失败"; exit 1; } +echo "" + +echo "9.3 合并当前分支到main" +git merge "$CURRENT_BRANCH" --no-ff -m "archive: $CURRENT_BRANCH → main [CI]" || { echo "❌ 合并分支失败"; exit 1; } +echo "" + +echo "9.4 创建版本标签" +export VERSION_TAG="v$(date +%Y.%m.%d)-${CI_COMMIT_SHA:0:7}" +git tag -a "$VERSION_TAG" -m "Release: $CURRENT_BRANCH → $VERSION_TAG [CI]" || { echo "❌ 创建标签失败"; exit 1; } +echo "" + +echo "9.5 推送到远程仓库" +git push origin main || { echo "❌ 推送main分支失败"; exit 1; } +git push origin --tags || { echo "❌ 推送标签失败"; exit 1; } +echo "" + +echo "✅ 归档成功完成!版本: $VERSION_TAG"