Jenkins中Hudson.AbortException(退出码-1073741819)的原因与解决
Jenkins Windows构建失败:exit code -1073741819 原因分析与修复方案
我有一套能在Windows和Linux上运行的Jenkins流水线脚本,Linux上跑完全正常,但在Windows系统里,测试阶段明明执行完成了,构建却因为Hudson.AbortException: script returned exit code -1073741819失败。虽然能用try-catch捕获异常,但我想搞清楚根本原因,以及怎么彻底修复。
相关代码
Jenkins流水线Groovy代码
try{ bat"${workspace}\env\python\python.exe -m coverage run -a setup.py test" bat"${workspace}\env\python\python.exe -m coverage xml -i" } catch(err){ echo "Error: ${err}" currentBuild.result = "FAILURE" }
Python setup.py中的ThreadPool代码
tp = ThreadPool(workers) for module in modules_list: tp.apply_async(test_module(module), (path_to_module_reports)) tp.close() tp.join()
根本原因分析
- exit code -1073741819对应Windows系统的
STATUS_ACCESS_VIOLATION错误,本质是程序尝试访问了未授权的内存区域。 - ThreadPool用法存在明显错误:
apply_async第一个参数需要传函数对象,但你写的test_module(module)是直接执行了函数,把返回值传进去了,这会导致线程逻辑混乱,甚至触发内存错误。 - Windows下coverage工具对多线程的支持不如Linux,加上Groovy脚本里的路径转义问题(单反斜杠会被解析为转义字符,导致路径无效),进一步加剧了问题。
修复方案
修正ThreadPool调用方式
把apply_async的参数写法改对,函数和参数分开传递:tp = ThreadPool(workers) for module in modules_list: # 第一个参数是函数对象,args是参数元组 tp.apply_async(test_module, args=(module, path_to_module_reports)) tp.close() tp.join() # 可选:加短暂等待确保线程资源完全释放 import time time.sleep(1)修复Groovy中的路径问题
Windows路径要用双反斜杠或者正斜杠,避免转义错误;同时可以去掉-a参数(追加覆盖数据),避免多线程下文件写入冲突:try{ bat "${workspace}\\env\\python\\python.exe -m coverage run setup.py test" bat "${workspace}\\env\\python\\python.exe -m coverage xml -i" } catch(err){ echo "Error: ${err}" currentBuild.result = "FAILURE" }更新coverage版本
旧版本coverage在Windows多线程场景下存在兼容性bug,升级到最新版能解决不少此类问题。
内容的提问来源于stack exchange,提问作者Ajay Malik
相关产品推荐
相关产品推荐

