diff --git a/.woodpecker.yml b/.woodpecker.yml index 079925d..21c6356 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -168,14 +168,14 @@ steps: depends_on: - build-and-deploy commands: - - echo "=== Archiving to main branch (Docker环境) ===" + - echo "=== Archiving to main branch (增强可靠性版本) ===" - echo "当前容器信息:" - 'echo "主机名: $(hostname)"' - 'echo "IP地址: $(hostname -i)"' - echo "" - echo "" - echo "1. 安装必要的工具" - - apk add --no-cache git openssh-client curl + - apk add --no-cache git openssh-client curl bind-tools netcat-openbsd - echo "" - echo "2. 配置SSH环境" - mkdir -p ~/.ssh @@ -186,18 +186,18 @@ steps: - 'wc -c < ~/.ssh/id_rsa' - echo "" - echo "3. 配置Git服务器主机密钥" - - ssh-keyscan -H git.f.novalon.cn >> ~/.ssh/known_hosts + - ssh-keyscan -H -p 22 git.f.novalon.cn >> ~/.ssh/known_hosts - echo "✅ Git服务器主机密钥已添加" - echo "" - - echo "4. 测试网络连接" + - echo "4. 增强网络连接测试" - echo "测试DNS解析:" - - 'nslookup git.f.novalon.cn || echo "DNS解析测试完成"' + - 'dig +short git.f.novalon.cn || nslookup git.f.novalon.cn || echo "DNS解析测试完成"' - echo "测试端口连通性:" - - 'nc -zv git.f.novalon.cn 22 && echo "SSH端口可达" || echo "SSH端口不可达"' + - 'timeout 10 nc -zv git.f.novalon.cn 22 && echo "✅ SSH端口可达" || echo "❌ SSH端口不可达"' - echo "" - - echo "5. 测试SSH连接" + - echo "5. 增强SSH连接测试" - echo "测试SSH连接到Git服务器..." - - 'ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 -T git@git.f.novalon.cn 2>&1 | head -10 || echo "SSH连接测试完成"' + - '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" @@ -208,18 +208,33 @@ steps: - git remote set-url origin git@git.f.novalon.cn:novalon/novalon-website.git - echo "✅ Git远程仓库已配置" - echo "" - - echo "8. 测试Git远程访问" + - echo "8. 增强Git远程访问测试" - echo "测试Git远程仓库访问权限..." - - git ls-remote origin --heads 2>&1 | head -5 || echo "Git远程访问测试完成" - - CURRENT_BRANCH="${CI_COMMIT_BRANCH}" - - echo "Current branch is $CURRENT_BRANCH" - - git checkout main - - git pull origin main - - 'git merge "$CURRENT_BRANCH" --no-ff -m "archive $CURRENT_BRANCH"' - - VERSION_TAG="v$(date +%Y.%m.%d)-${CI_COMMIT_SHA:0:7}" - - 'git tag -a "$VERSION_TAG" -m "Release from $CURRENT_BRANCH"' - - git push origin main && git push origin --tags - - echo "Archive succeeded with version $VERSION_TAG" + - '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"' when: event: - push diff --git a/scripts/test-cicd-config.sh b/scripts/test-cicd-config.sh new file mode 100755 index 0000000..6276a4c --- /dev/null +++ b/scripts/test-cicd-config.sh @@ -0,0 +1,125 @@ +#!/bin/bash + +# CICD配置验证脚本 +# 用于验证Woodpecker CI配置的正确性和可靠性 + +echo "=== CICD配置验证脚本 ===" +echo "" + +# 1. 检查YAML语法 +echo "1. 检查YAML语法..." +if command -v yamllint >/dev/null 2>&1; then + yamllint .woodpecker.yml && echo "✅ YAML语法检查通过" || echo "❌ YAML语法检查失败" +else + echo "⚠ yamllint未安装,跳过语法检查" +fi + +# 2. 检查关键文件存在性 +echo "" +echo "2. 检查关键文件存在性..." +files_to_check=(".woodpecker.yml" "package.json" "next.config.ts" "Dockerfile.prod" "docker-compose.server.yml") + +for file in "${files_to_check[@]}"; do + if [ -f "$file" ]; then + echo "✅ $file 存在" + else + echo "❌ $file 不存在" + fi +done + +# 3. 检查package.json脚本 +echo "" +echo "3. 检查package.json脚本..." +if [ -f "package.json" ]; then + required_scripts=("build" "lint" "type-check" "test") + for script in "${required_scripts[@]}"; do + if grep -q "\"$script\"" package.json; then + echo "✅ $script 脚本存在" + else + echo "❌ $script 脚本不存在" + fi +done +fi + +# 4. 检查构建配置 +echo "" +echo "4. 检查构建配置..." +if [ -f "next.config.ts" ]; then + echo "✅ Next.js配置文件存在" + # 检查是否有明显的配置问题 + if grep -q "output" next.config.ts; then + echo "✅ 输出配置已设置" + else + echo "⚠ 输出配置可能需要检查" + fi +fi + +# 5. 验证SSH配置 +echo "" +echo "5. 验证SSH配置..." +echo "检查SSH服务器连通性..." + +# 测试DNS解析 +echo "测试DNS解析 git.f.novalon.cn..." +if command -v dig >/dev/null 2>&1; then + dig +short git.f.novalon.cn >/dev/null 2>&1 && echo "✅ DNS解析成功" || echo "❌ DNS解析失败" +elif command -v nslookup >/dev/null 2>&1; then + nslookup git.f.novalon.cn >/dev/null 2>&1 && echo "✅ DNS解析成功" || echo "❌ DNS解析失败" +else + echo "⚠ DNS工具未安装,跳过测试" +fi + +# 测试端口连通性 +echo "测试端口连通性 git.f.novalon.cn:22..." +if command -v nc >/dev/null 2>&1; then + timeout 5 nc -zv git.f.novalon.cn 22 >/dev/null 2>&1 && echo "✅ 端口连通性正常" || echo "❌ 端口连通性失败" +else + echo "⚠ netcat未安装,跳过测试" +fi + +# 6. 检查部署脚本 +echo "" +echo "6. 检查部署脚本..." +if [ -f "scripts/deploy-production.sh" ]; then + echo "✅ 部署脚本存在" + # 检查脚本权限 + if [ -x "scripts/deploy-production.sh" ]; then + echo "✅ 部署脚本可执行" + else + echo "⚠ 部署脚本不可执行,需要chmod +x" + fi +else + echo "❌ 部署脚本不存在" +fi + +# 7. 验证Docker配置 +echo "" +echo "7. 验证Docker配置..." +if [ -f "Dockerfile.prod" ]; then + echo "✅ 生产Dockerfile存在" + # 检查基础镜像 + if grep -q "FROM" Dockerfile.prod; then + echo "✅ Dockerfile包含FROM指令" + fi +fi + +if [ -f "docker-compose.server.yml" ]; then + echo "✅ Docker Compose配置文件存在" +fi + +# 8. 总结报告 +echo "" +echo "=== 验证总结 ===" +echo "" +echo "建议:" +echo "1. 确保所有必需的文件都存在" +echo "2. 验证SSH连接和网络连通性" +echo "3. 测试构建和部署流程" +echo "4. 检查环境变量和密钥配置" +echo "" +echo "要触发CICD测试,可以:" +echo "- 推送代码到release分支" +echo "- 手动触发Woodpecker CI流水线" +echo "- 监控构建日志和错误信息" +echo "" +echo "验证脚本完成!" \ No newline at end of file