Files
novalon-website/scripts/diagnosis/diagnose-woodpecker.py
T

138 lines
4.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""
Woodpecker CI 配置诊断工具
检查配置文件中可能导致 CI 未触发的问题
"""
import yaml
from pathlib import Path
def diagnose_woodpecker_config(config_path):
"""诊断 Woodpecker CI 配置"""
with open(config_path, 'r', encoding='utf-8') as f:
config = yaml.safe_load(f)
print("="*70)
print("Woodpecker CI 配置诊断报告")
print("="*70)
issues = []
warnings = []
# 检查是否有 steps
if 'steps' not in config:
issues.append("❌ 缺少 'steps' 配置")
else:
print(f"\n✅ 找到 {len(config['steps'])} 个步骤")
# 检查每个步骤的 when 条件
print("\n📋 步骤触发条件检查:")
print("-" * 70)
for step_name, step_config in config.get('steps', {}).items():
if not isinstance(step_config, dict):
continue
when = step_config.get('when', {})
if not when:
warnings.append(f"⚠️ 步骤 '{step_name}' 没有 when 条件,将始终执行")
continue
# 检查 when 条件的格式
if isinstance(when, list):
print(f"\n步骤: {step_name}")
print(f" when 条件格式: 列表(多个条件)")
for i, condition in enumerate(when):
if isinstance(condition, dict):
events = condition.get('event', [])
branches = condition.get('branch', [])
print(f" 条件 {i+1}:")
print(f" 事件: {events}")
print(f" 分支: {branches}")
elif isinstance(when, dict):
print(f"\n步骤: {step_name}")
print(f" when 条件格式: 字典(单个条件)")
events = when.get('event', [])
branches = when.get('branch', [])
print(f" 事件: {events}")
print(f" 分支: {branches}")
# 检查可能导致问题的配置
print("\n\n🔍 潜在问题分析:")
print("-" * 70)
# 检查是否有 skip_clone
if config.get('skip_clone'):
warnings.append("⚠️ skip_clone 设置为 true,可能影响代码获取")
# 检查 clone 配置
clone_config = config.get('clone', {})
if clone_config:
print(f"\nClone 配置: {clone_config}")
# 检查 services
services = config.get('services', {})
if services:
print(f"\n服务配置: {list(services.keys())}")
# 检查 workspace
workspace = config.get('workspace', {})
if workspace:
print(f"\n工作区配置: {workspace}")
# 输出问题
print("\n\n📊 诊断结果:")
print("="*70)
if issues:
print("\n❌ 发现的问题:")
for issue in issues:
print(f" {issue}")
if warnings:
print("\n⚠️ 警告:")
for warning in warnings:
print(f" {warning}")
if not issues and not warnings:
print("\n✅ 配置文件语法正确,未发现明显问题")
# 输出可能的原因
print("\n\n🔍 CI 未触发的可能原因:")
print("-" * 70)
possible_reasons = [
"1. Woodpecker CI 的 Webhook 未正确配置",
"2. Git 仓库设置中禁用了该分支的 CI 触发",
"3. Woodpecker CI 服务器未运行或配置错误",
"4. 配置文件中的分支匹配规则与 Woodpecker CI 版本不兼容",
"5. 需要在 Woodpecker CI 界面手动激活该仓库",
"6. Woodpecker CI 的全局配置限制了某些分支",
"7. 推送的提交信息触发了 CI 跳过(如包含 [skip ci]",
]
for reason in possible_reasons:
print(f" {reason}")
print("\n\n💡 建议的排查步骤:")
print("-" * 70)
suggestions = [
"1. 检查 Woodpecker CI Web 界面,确认仓库已激活",
"2. 检查 Git 仓库的 Webhook 设置",
"3. 查看 Woodpecker CI 的日志",
"4. 尝试手动触发 CI(如果支持)",
"5. 检查 Woodpecker CI 的全局配置",
"6. 创建一个简单的测试分支验证配置",
]
for suggestion in suggestions:
print(f" {suggestion}")
print("\n" + "="*70)
if __name__ == "__main__":
diagnose_woodpecker_config(".woodpecker.yml")