已合并
基于 devcontainer 的 MindStudio 统一开发环境方案 #392
Zhang-Yu001创建于 16 天前
基于 devcontainer 的 MindStudio 统一开发环境方案 #392
已合并
Zhang-Yu001创建于 16 天前
Zhang-Yu001
Zhang-Yu001成员
16 天前

PR 合入模板

注:经过自检不涉及的可标注“不涉及”或直接打勾,特殊情况请文字备注。不符合规范的 PR 不允许合入,请(后备)commit 注意。


1. 修改描述

  • 修改原因: msprof 缺少标准化 devcontainer 开发环境,开发者本地环境不一致,构建依赖需手动安装,IDE 代码跳转/调试配置繁琐。

  • 修改内容:
    新增 6 个文件:

    • .devcontainer/devcontainer.json — 容器底座配置,固化 MindStudio 构建镜像、挂载、用户映射、环境变量、VS Code 推荐扩展和生命周期钩子
    • .devcontainer/post-create.sh — 幂等初始化脚本,9 个步骤:用户 bin 目录、Python 3 环境配置(自动检测 pyenv Python 路径并优先)、系统/pip 编译测试依赖自动补齐(含 pytest/coverage)、gitleaks
      多镜像源兜底安装、pre-commit 安装、clangd 就绪、skip-worktree(settings.json + version.info)、compile_commands 检查
    • .vscode/settings.json — watcher/search 排除构建、依赖和测试目录;禁用 cpptools IntelliSense,clangd 参数由 devcontainer.json 统一管理
    • .vscode/tasks.json — 4 个 VS Code Task:Build: Release Mode / Build: Debug Mode / Test: Run Unit Tests / Clean: All Workspace
    • .vscode/launch.json — Python debugpy 调试配置,含 PYTHONPATH 和 LD_LIBRARY_PATH 环境变量
    • .clangd — clangd 编译数据库路径声明(CompileFlags.CompilationDatabase: build/)

    修改 6 个文件:

    • .gitignore.vscode/ 改为 .vscode/settings.json(保留 launch.json 和 tasks.json 的跟踪);补充 artifacts/dist/.venv/.cache/.ruff_cache/.devcontainer/.host-gitconfig
    • .pre-commit-config.yaml — gitleaks entry 从本地 ./gitleaks 改为系统 gitleaks;bandit 增加 additional_dependencies: [".[toml]"] 解决 toml 解析器缺失
    • CMakeLists.txt — 新增 set(CMAKE_EXPORT_COMPILE_COMMANDS ON) 为 clangd 生成编译数据库
    • build.py — 新增 only_down_deps 参数支持,用于 IDE Debug 构建时仅下载依赖而不编译
    • scripts/download_thirdparty.sh — googletest 从 1.12.1 降级到 1.10.0(C++14 兼容),下载后自动移除 -Werror 标志
    • scripts/execute_cpp_test_case.sh — 测试前备份 analysis/csrc/ 目录,trap EXIT 自动恢复,避免 LCOV_EXCL_LINE 注释和换行符转换污染源文件

2. 功能验证

  • 功能自验
    初始化.png
    编译.png
    提交.png

  • 本地自验用例截图
    测试.png

  • 测试结果说明:

    C++ 单元测试 244 个用例中 243 个通过,1 个失败:

    [ PASSED ] 243 tests.
    [ FAILED ] 1 test: DBAssemblerUTest.TestRunSaveOverlapAnalysisDataShouldReturnFalseWhenReserveFailed

    该失败与 devcontainer 变更无关。 本次变更未修改任何 analysis/csrc/ 下的 C++ 源码。失败原因是该测试用例依赖特定的 sqlite 运行时行为(reserve 操作),在当前容器环境(openEuler 24.03 + sqlite嵌入式)下条件未满足。此为预存问题,在原生的命令行构建环境中同样存在(bash scripts/execute_cpp_test_case.sh 运行结果一致),非 devcontainer 引入的回归。

    Python 单元测试全量通过。

  • 冒烟是否通过 (填入群链接的自验证报告中,如未通过,请说明原因:____________________ ,功能代码请主动申报添加冒烟)


3. 分支合并要求

  • 代码合并(请确保将 master 分支的最新代码同步合并至 poc 分支及 pre-research 分支,同时保证 poc 分支的代码也已正确合并到 pre-research 分支。)

3. 代码检视

  • 要求:

    • 合入代码超过 200 行,需三人以上会议检视。
    • 检视密度≥1个/100行。
    • 检视缺陷密度未达要求需提供说明。
    • 大于 1000 行代码原则上不允许合入,需进行备案。
  • 是否经过代码检视

  • 是否具备 UT 测试用例看护 (如不符合,请说明原因:____________________)

  • 检视意见数:____ 条 (请填写本次检视的意见总数,用于commit合入前审视)


4. 安全自检

Python、C++

  • 对外接口新增/删除/变更后,资料要同步新增/删除/变更,新增接口入参校验参考外部输入表格
  • 不允许私有的文件操作,需要使用公共模块的安全函数
  • 任务结束后需要删除临时文件,同时需要考虑任务失败后,临时文件没有残留
  • 数组访问需要校验越界场景,对除法需要做除零校验
  • 需要对递归方法做递归深度校验,正则表达式必须做 ReDoS 校验
  • 需要充分进行接口输入和返回值异常情况的校验
  • 日志打印不要出现拼写或语法错误,不要暴露代码细节和敏感信息

C++

  • 指针使用前需要判空
  • 数值计算校验溢出和反转
  • 不可存在内存泄漏(异常场景需要释放内存)
  • 类型转换不能出现数据截断
  • 拷贝字符串时,目的缓冲区至少比源缓冲区大 1
  • 拷贝内存时,目的缓冲区不小于源缓冲区
  • 内存释放后指针赋值为 nullptr

5. 变更知会

  • 资料修改 - docs/zh/development_guide/development_guide.md — 第 3 章"开发环境配置"新增 3.1 节 devcontainer 一键开发环境使用方法(前置条件、使用步骤、VS Code 内置任务、代码跳转与调试说明),原手工配置改为 3.2 节
  • 变更通知(消息知会 + 邮件知会)

likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 Zhang-Yu001 的贡献)
atomgit-bot
atomgit-bot
16 天前 评论:

变更摘要

本次 PR 为 msprof 项目引入基于 devcontainer 的统一开发环境方案,新增 .devcontainer.vscode 目录下的容器配置、初始化脚本及 IDE 集成文件,同时调整了构建脚本和 pre-commit 配置以适配容器内开发场景。核心目标是消除开发者本地环境差异,实现构建依赖自动安装、IDE 代码跳转/调试零配置,以及测试流程的环境隔离保护。

主要改动

  • 新增 devcontainer.json 容器底座配置:指定 swr.cn-north-4.myhuaweicloud.com/mindstudio-image/mindstudio-build:26.1.0-0701 为基础镜像,采用 bind 挂载方式将本地工作区映射至容器内的 /workspace,配置 host 网络、特权模式、IPC 共享等运行参数,并预置 VS Code 推荐扩展(C++、Python、clangd、ruff 等)及 clangd 参数(--query-driver=*--header-insertion=iwyu)。

  • 新增 post-create.sh 幂等初始化脚本:按 9 个步骤依次执行:用户 ~/.local/bin 目录配置、pyenv Python 路径自动检测并优先写入 PATH、通过 dnf/apt 补齐系统编译依赖并安装 gitleaks(arm64 二进制下载)、pip 安装 pytest/coverage/pre-commit/bandit[toml]、Git 身份同步、pre-commit hook 自动安装、clangd 就绪检查与安装、对 .vscode/settings.jsonversion.info 设置 skip-worktree、提示 compile_commands.json 生成方式。

  • build.py 新增 only_down_deps 参数支持:当通过 -e only_down_deps=true 传入时,仅执行第三方依赖下载后即退出,不继续编译和测试,专为 IDE Debug 构建流程设计。

  • download_thirdparty.sh 中 googletest 版本及编译选项调整:将 googletest 从 release-1.12.1 降级至 release-1.10.0,并通过 sed 移除其 cmake 内部 cxx_base_flags 中的 -Werror,避免 GCC 编译时因警告升级为错误而失败。

  • execute_cpp_test_case.sh 增加源码备份恢复机制:在用 change_file_to_unix_formatadd_gcov_excl_line 修改 analysis/csrc 源码(添加 LCOV 排除注释)前,先创建临时备份;测试结束后通过 trap ... EXIT 自动恢复原始文件,防止覆盖率处理污染工作区源文件。

likedislike
atomgit-bot
atomgit-bot
16 天前 评论:

代码审查

审查总结

优先级 数量 文件
P1 1 build.pyonly_down_deps 在非 test 分支无效
P2 3 post-create.sh (gitleaks arm64)、download_thirdparty.sh (googletest 降级)、devcontainer.json (特权模式)
P3 3 devcontainer.json (无效 clangd 配置)、post-create.sh (无校验和)、tasks.json (globstar 依赖)

各文件审查结论:

文件 结论
.clangd 无问题
.devcontainer/devcontainer.json P2 (特权模式) + P3 (无效 clangd 配置)
.devcontainer/post-create.sh P2 (gitleaks arm64 硬编码) + P3 (无校验和)
.gitignore 无问题
.pre-commit-config.yaml 无问题
.vscode/launch.json 无问题
.vscode/tasks.json P3 (Clean 任务 globstar 依赖)
CMakeLists.txt 无问题
build.py P1 (only_down_deps 分支放置错误)
docs/zh/development_guide/development_guide.md 无问题
scripts/download_thirdparty.sh P2 (googletest 版本降级 + 脆弱 sed)
scripts/execute_cpp_test_case.sh 无问题

整体风险判断:中等。 P1 问题会导致 VS Code Debug Mode 构建任务行为异常(先执行完整 Release 构建再 Debug 构建),影响核心开发工作流,建议优先修复。P2 问题中 gitleaks 架构硬编码会使 x86_64 环境下密钥扫描失效,googletest 版本回退和特权容器也值得关注。其余 P3 问题为改进建议。

类型 数量
🔴 阻塞 1
🟡 建议 5

⛔ 需要修改

likedislike
ascend-robotascend-robot成员
16 天前 添加了label:stat/needs-squash
ascend-robotascend-robot成员
16 天前 添加了label:ascend-cla/yes
此处折叠了75条消息 查看更多
leo920320成员
10 天前 评论:

此需求仅涉及CI工程,不涉及C++代码。

likedislike
leo920320成员
10 天前 评论:

/approve

likedislike
ascend-robotascend-robot成员
10 天前 添加了label:approved
ascend-robotascend-robot成员
10 天前 合入了pull request
ascend-robot
ascend-robot成员
10 天前 评论:

Pull Request 已合并或已关闭。

If you want to solve this problem, you can click here to do it in the FAQs.

likedislike