这套方案的核心逻辑是:“容器化环境 + 智能降级策略 + 分步执行”。
你需要开发一个控制脚本(Python/Go),按照以下流程去操作:
- 核心架构:必须上 Docker 不要在你的服务器裸机上跑 C++ 建库。
准备一个“胖镜像” (Fat Docker Image):
基础镜像:Ubuntu 20.04/22.04
预装工具:CodeQL CLI, GCC, Clang, Make, CMake, Ninja, Maven, Gradle, Ant, Python, git。
预装库(关键):build-essential, libssl-dev, zlib1g-dev, libboost-all-dev, 以及其他常见的 C++ 开发库。
理由:C++ 编译缺一个库就会挂,预装越多,成功率越高。
- 自动化脚本逻辑流程图 你的工具应该按照这个优先级逻辑来运行:
第一步:初始化 (Init) 无论什么情况,先搭好架子。
Bash
codeql database init --language=cpp --source-root=/src /out/db --overwrite 第二步:构建探测与注入 (Trace) —— 最核心逻辑 这里采用 “三级降级策略”:
Level 1:用户显式提供了构建命令 (优先级最高)
场景:用户在界面填了 mkdir build && cd build && cmake .. && make。
动作:直接执行。
Trick:在命令前强行拼一个 clean 操作(如果能识别构建系统),或者简单粗暴建议用户提供带 clean 的命令。
执行:codeql database trace-command /out/db -- <用户命令>
Level 2:启发式探测 (如果没有用户命令)
你的脚本去源代码根目录看一眼:
有 CMakeLists.txt -> 自动构造命令:mkdir -p build && cd build && cmake .. -DCMAKE_BUILD_TYPE=Release && make -j$(nproc)
只有 Makefile -> 自动构造命令:make clean && make -j$(nproc)
有 build.sh 或 configure -> 自动构造命令:chmod +x build.sh && ./build.sh
执行:codeql database trace-command /out/db -- <构造的命令>
Level 3:Autobuild 兜底 (最后手段)
如果上面都没匹配到,死马当活马医。
执行:codeql database trace-command /out/db -- codeql-autobuild
第三步:封包 (Finalize) Bash
codeql database finalize /out/db 第四步:质量校验 (Validate) 这步不能省! C++ 建库最怕“假成功”(命令跑完了,但其实没编译到东西)。
检查指标:
检查数据库目录下的 src.zip 是否存在且大于几 KB。
(进阶) 检查 db-cpp/default/trap 目录下是否有数据。
动作:如果校验失败,标记任务为 Failed,并输出日志提示用户“编译环境缺失或构建命令错误”。