优化:Validate 检查内部并行化(8→2组并行) #707
Reference in New Issue
Block a user
Delete Branch "feat/ci-validate-parallel"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
变更概述
将
scripts/ci/run_validate.sh从串行执行 8 项检查重构为 5 个子任务并行执行,预期耗时从 ~1.8min 降至 ~1min。并行分组
Group A(独立并行,无需外部依赖)
Group B(PG 依赖,独立并行)
5 个子任务同时启动,全部完成后汇总结果。
实现方式
/tmp/validate_logs/独立日志文件wait收集所有后台任务的退出码影响范围
仅修改
scripts/ci/run_validate.sh,不涉及业务代码。将 run_validate.sh 从串行执行 8 项检查重构为 5 个子任务并行执行: 并行分组: Group A(独立并行): A1: Secret detection (detect-secrets) A2: Code quality checks (black/isort/ruff/compileall) A3: Mypy type check A4: Advisory checks (bandit + pip-audit + vulture + 脚本语法) Group B(PG 依赖,独立并行): B1: Alembic migrations validation 实现方式:bash background jobs + wait - 每个子任务独立函数,输出写入 /tmp/validate_logs/ 独立日志 - wait 收集所有后台任务退出码 - 阻断类(secret/code quality/mypy/alembic)失败则整体失败 - 告警类(bandit/pip-audit/vulture)不阻断,行为不变 - 增量模式逻辑完整保留 - PG 迁移验证独立运行,不与其他检查争资源 - 完成后按顺序打印摘要,失败任务打印完整日志 预期耗时从 ~1.8min 降至 ~1min🚀 预览环境已部署
CI全绿,自动审批通过。
CI全绿,自动审批通过。
代码审查结果 - PR #707
⚠️ 问题(3个需要修改)
scripts/ci/run_validate.sh 第130行:敏感信息泄露风险(Token 暴露在进程列表)
curl命令通过-H "Authorization: token ${GITHUB_TOKEN}"直接传递 Token。在 Linux 系统中,当前用户的所有进程(及其参数)通常对同主机上的其他用户可见(如通过ps aux)。在 CI 共享 Runner 环境中,这可能导致 Token 泄露给同一节点的其他并发任务。curl不支持直接从环境变量读取 Header,但应尽量避免将敏感明文放在命令行参数中。建议使用netrc文件或 CI 环境提供的更安全的封装方式;若必须使用此方式,需评估 CI 环境隔离性。scripts/ci/run_validate.sh 第152行:逻辑错误(空文件列表导致工具挂起)
task_code_quality函数中,如果 PR 中删除了所有 Python 文件(或过滤后EXISTING_PY_FILES为空),变量CHANGED_PY_FILES将为空字符串。随后执行python3 -m black --check --fast $CHANGED_PY_FILES时,black因未接收到文件参数,会尝试从标准输入(stdin)读取数据。black(及后续的isort/ruff)可能会挂起等待输入,导致 CI 流程卡死超时。if [ -n "$CHANGED_PY_FILES" ]; then,确保仅在存在待检查文件时才调用工具。scripts/ci/run_validate.sh 第140行:逻辑缺陷(文件名包含空格导致检查失败)
print(' '.join(...))),并在 Shell 中使用for f in $CHANGED_PY_FILES进行遍历。如果仓库中存在包含空格的文件名(如my file.py),Shell 会将其拆分为两个参数(my和file.py),导致后续的[ -f "$f" ]检查失败,以及black等工具报错。💡 建议(2个可选)
死代码清理:
record_result函数被定义并在子任务中被调用,用于将结果写入文件,但在主流程的“结果汇总”阶段,脚本直接使用了wait命令捕获的退出码(TASK_EXIT),并未读取record_result写入的文件。建议删除record_result函数及相关调用,以减少混淆。命令行参数长度风险:
task_code_quality中将所有变更文件名拼接到变量CHANGED_PY_FILES并直接作为参数传递给black/isort/ruff。如果 PR 变更文件极多(例如数千个),可能会超过系统的ARG_MAX限制,导致命令执行失败。建议使用xargs分批处理或通过参数文件(@args.txt)方式传递文件列表。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能
🤖 由 AI 代码审查机器人自动生成 | 2026-07-22 12:30:46 | 模型:
🗑️ 预览环境已清理
PR #707 已关闭或合并,对应的预览环境已被清理。