fix: 修复CI/CD流程问题并建立监控机制
- 禁用Git LFS(项目未使用LFS) - 修复企业微信通知环境变量展开问题 - 创建CI/CD诊断脚本 - 建立持续监控机制 - 添加预防措施文档 问题根本原因: 1. Woodpecker CI Git插件默认启用LFS,导致不必要的LFS命令执行 2. Shell脚本heredoc块内变量展开时机问题导致环境变量丢失 修复方案: 1. 在clone配置中添加 lfs: false 2. 将环境变量赋值移到单独的命令行,heredoc仅用于生成JSON 验证方法: - 运行 diagnose-cicd-issues.sh 进行诊断 - 运行 scripts/monitoring/cicd-monitor.sh 进行监控
This commit is contained in:
Executable
+165
@@ -0,0 +1,165 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
echo "=========================================="
|
||||
echo "CI/CD 持续监控脚本"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
MONITOR_DIR="./logs/cicd-monitor"
|
||||
mkdir -p "$MONITOR_DIR"
|
||||
|
||||
TIMESTAMP=$(date "+%Y%m%d_%H%M%S")
|
||||
LOG_FILE="$MONITOR_DIR/monitor_${TIMESTAMP}.log"
|
||||
|
||||
echo "监控日志: $LOG_FILE"
|
||||
echo ""
|
||||
|
||||
log() {
|
||||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
log "开始 CI/CD 监控..."
|
||||
|
||||
log ""
|
||||
log "=========================================="
|
||||
log "1. 检查 Git LFS 配置"
|
||||
log "=========================================="
|
||||
|
||||
if [ -f ".gitattributes" ]; then
|
||||
log "✅ .gitattributes 存在"
|
||||
log "内容:"
|
||||
cat .gitattributes | tee -a "$LOG_FILE"
|
||||
else
|
||||
log "✅ .gitattributes 不存在(项目未使用LFS)"
|
||||
fi
|
||||
|
||||
if grep -q "lfs: false" .woodpecker.yml; then
|
||||
log "✅ Woodpecker CI 配置已禁用 LFS"
|
||||
else
|
||||
log "⚠️ Woodpecker CI 配置未禁用 LFS"
|
||||
fi
|
||||
|
||||
log ""
|
||||
log "=========================================="
|
||||
log "2. 检查 Woodpecker CI 配置语法"
|
||||
log "=========================================="
|
||||
|
||||
if command -v yamllint &> /dev/null; then
|
||||
if yamllint .woodpecker.yml > /dev/null 2>&1; then
|
||||
log "✅ YAML 语法正确"
|
||||
else
|
||||
log "❌ YAML 语法错误"
|
||||
yamllint .woodpecker.yml | tee -a "$LOG_FILE"
|
||||
fi
|
||||
else
|
||||
log "⚠️ yamllint 未安装,跳过语法检查"
|
||||
fi
|
||||
|
||||
log ""
|
||||
log "=========================================="
|
||||
log "3. 检查企业微信通知配置"
|
||||
log "=========================================="
|
||||
|
||||
if grep -q "WECHAT_WEBHOOK" .woodpecker.yml; then
|
||||
log "✅ 企业微信通知已配置"
|
||||
|
||||
if grep -q 'BRANCH="${CI_COMMIT_BRANCH' .woodpecker.yml; then
|
||||
log "✅ 环境变量展开格式正确"
|
||||
else
|
||||
log "⚠️ 环境变量展开格式可能有问题"
|
||||
fi
|
||||
else
|
||||
log "⚠️ 企业微信通知未配置"
|
||||
fi
|
||||
|
||||
log ""
|
||||
log "=========================================="
|
||||
log "4. 检查 Secrets 配置"
|
||||
log "=========================================="
|
||||
|
||||
REQUIRED_SECRETS=(
|
||||
"registry_password"
|
||||
"ssh_private_key"
|
||||
"wechat_webhook"
|
||||
)
|
||||
|
||||
for secret in "${REQUIRED_SECRETS[@]}"; do
|
||||
if grep -q "from_secret: $secret" .woodpecker.yml; then
|
||||
log "✅ Secret '$secret' 已配置"
|
||||
else
|
||||
log "❌ Secret '$secret' 未配置"
|
||||
fi
|
||||
done
|
||||
|
||||
log ""
|
||||
log "=========================================="
|
||||
log "5. 检查分支保护规则"
|
||||
log "=========================================="
|
||||
|
||||
BRANCHES=("main" "dev" "release" "release/**")
|
||||
|
||||
for branch in "${BRANCHES[@]}"; do
|
||||
if grep -q "branch:" .woodpecker.yml && grep -A 5 "branch:" .woodpecker.yml | grep -q "$branch"; then
|
||||
log "✅ 分支 '$branch' 已配置触发规则"
|
||||
else
|
||||
log "⚠️ 分支 '$branch' 未配置触发规则"
|
||||
fi
|
||||
done
|
||||
|
||||
log ""
|
||||
log "=========================================="
|
||||
log "6. 检查部署配置"
|
||||
log "=========================================="
|
||||
|
||||
if grep -q "deploy-production" .woodpecker.yml; then
|
||||
log "✅ 生产部署步骤已配置"
|
||||
|
||||
if grep -q "Health check" .woodpecker.yml; then
|
||||
log "✅ 健康检查已配置"
|
||||
else
|
||||
log "⚠️ 健康检查未配置"
|
||||
fi
|
||||
|
||||
if grep -q "rolling back" .woodpecker.yml; then
|
||||
log "✅ 回滚机制已配置"
|
||||
else
|
||||
log "⚠️ 回滚机制未配置"
|
||||
fi
|
||||
else
|
||||
log "⚠️ 生产部署步骤未配置"
|
||||
fi
|
||||
|
||||
log ""
|
||||
log "=========================================="
|
||||
log "7. 性能指标检查"
|
||||
log "=========================================="
|
||||
|
||||
if [ -d "node_modules" ]; then
|
||||
NODE_MODULES_SIZE=$(du -sh node_modules | cut -f1)
|
||||
log "node_modules 大小: $NODE_MODULES_SIZE"
|
||||
fi
|
||||
|
||||
if [ -d "dist" ]; then
|
||||
DIST_SIZE=$(du -sh dist | cut -f1)
|
||||
log "dist 目录大小: $DIST_SIZE"
|
||||
fi
|
||||
|
||||
GIT_OBJECTS=$(find .git/objects -type f | wc -l | tr -d ' ')
|
||||
log "Git 对象数量: $GIT_OBJECTS"
|
||||
|
||||
log ""
|
||||
log "=========================================="
|
||||
log "监控完成"
|
||||
log "=========================================="
|
||||
log ""
|
||||
log "📊 监控报告已保存到: $LOG_FILE"
|
||||
log ""
|
||||
|
||||
echo ""
|
||||
echo "💡 建议操作:"
|
||||
echo " 1. 定期运行此监控脚本(建议每小时一次)"
|
||||
echo " 2. 将日志文件纳入版本控制"
|
||||
echo " 3. 设置告警机制(如连续3次失败则发送通知)"
|
||||
echo ""
|
||||
Reference in New Issue
Block a user