Prhub

#38585 [ROCm][CI/Build] Fix the pytest hook to properly print out the summary

原始 PR 作者 gshtras 合并时间 2026-04-03 17:24 文件变更 1 提交数 2 评论 3 代码增减 +14 / -1

执行摘要

修复 ROCm Dockerfile 中 pytest 退出钩子,确保测试摘要正确打印且保留退出码。

根据PR body描述,这是#38252的后续修复,需要修改ROCm7.2.1的pytest工作around,确保测试能够正确结束,包括打印摘要,同时保留退出码。review评论进一步说明原实现存在输出缓冲区未刷新的问题,可能导致测试摘要被截断。

该PR变更简单直接,主要价值在于展示了如何正确处理pytest退出时的缓冲区和状态码问题。对于负责CI/基础设施的工程师值得快速浏览,了解pytest钩子的正确使用模式。无需深入分析核心代码。

讨论亮点

gemini-code-assist[bot]指出原方案存在两个关键问题:

1) os._exit()立即终止进程不刷新I/O缓冲区,可能导致测试摘要丢失;
2) 初始退出码设为0可能掩盖早期失败。建议添加sys.stdout.flush()和sys.stderr.flush(),并将_exit_code初始化为非零值。AndreasKaratzas指出缺少sys导入,并引用#38951作为相关修复。最终实现采纳了这些建议。

实现拆解

修改docker/Dockerfile.rocm文件中的conftest.py生成逻辑:

  1. 将单行echo命令替换为heredoc多行定义
  2. 新增sys模块导入(根据review反馈补充)
  3. 将退出逻辑拆分为两个钩子函数:pytest_sessionfinish记录退出码,pytest_unconfigure在退出前刷新stdout/stderr缓冲区
  4. 将初始退出码从0改为1,避免早期失败被掩盖
文件 模块 状态 重要度
docker/Dockerfile.rocm CI/ 构建 modified 3.0

关键符号

pytest_sessionfinish pytest_unconfigure

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

pytest 退出钩子的缓冲区刷新问题 正确性

gemini-code-assist[bot] 指出 os._exit() 立即终止进程不刷新 I/O 缓冲区,可能导致测试摘要丢失

结论:实现中添加了 sys.stdout.flush() 和 sys.stderr.flush() 调用 · 已解决

缺失 sys 模块导入 正确性

AndreasKaratzas 指出代码缺少 sys 导入

结论:在最终实现中添加了 import sys · 已解决

风险与影响

风险较低:

  1. 仅影响ROCm Docker镜像构建,不涉及核心推理逻辑
  2. 变更集中在conftest.py的pytest钩子实现,影响范围有限
  3. 潜在风险是如果pytest_unconfigure未被调用(极少数情况),可能导致退出码传递失败,但概率很低

影响范围:

  1. 对用户:无直接影响,仅影响CI测试环境
  2. 对系统:改善ROCm CI测试的日志完整性和退出码可靠性
  3. 对团队:提升ROCm测试的可调试性,确保测试失败时能正确输出摘要和退出码
    影响程度:低,属于基础设施维护性修复
基础设施变更 依赖外部工具行为

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论