以下关于Jenkins freestyle的命令在Windows环境中不会退出(永远运行)。但是,当我在CMD中运行相同的命令时,它按预期工作。
matlab -nodesktop -nosplash -minimize -c "path_to_license" -r "run('path_to_run_all_tests_script')" -wait -logfile unittestlog.txt set output=%errorlevel% MORE unittestlog.txt EXIT %output%
我做错了什么?
编辑:
这是命令调用的Matlab脚本:
import matlab.unittest.TestSuite;
disp('Hello from TestSuite');
try
suite = TestSuite.fromPackage('test','IncludingSubpackages',true);
results = run(suite);
display(results);
catch e
disp(getReport(e,'extended'));
exit(1);
end
exit(any([results.Failed])+1);
答案 0 :(得分:2)
我的猜测是这是一个许可问题 - 您需要Jenkins作为MATLAB许可证中指定的同一用户运行(当然假设您的MATLAB许可证是指定用户许可证 - 如果它&#39 ; sa并发或命名机器许可证,请忽略我。)
如果用户不对,那么MATLAB将启动,但会显示一个对话框,告诉您许可问题。但是,由于您已使用-nodesktop
调用它,因此该对话框将不可见,并且MATLAB将永远作为一个" zombie"进程而不向Jenkins发送返回值。如果你进入任务管理器,你可能会发现你有一个或多个闲置,你可以在那里强制退出它们。
请注意,如果您通过Jenkins运行MATLAB进行单元测试或自动构建,则应注意许可要求。如果您拥有命名用户许可证,则只允许该命名用户使用它,并且包括通过Jenkins。只要您是唯一可以启动Jenkins / MATLAB工作的人,这很好 - 但是如果您将Jenkins暴露给几个用户,所有人都可以启动MATLAB工作,您违反了许可协议。如果你需要这样做,你应该真正获得Jenkins的并发许可证。但这有点灰色,您可能想与您的客户经理谈谈此事。
希望有所帮助!
编辑:我想您可能还想查看您在测试脚本中使用的退出代码。您希望MATLAB在测试通过时以成功代码0退出,在测试失败时或在测试期间发生错误时退出非零失败代码。因此,您可能希望最后一行为exit(any([results.Failed]));
,而不是exit(any([results.Failed])+1);
。
答案 1 :(得分:0)
问题与许可有关。 Jenkins应由拥有Matlab许可证的同一用户运行。
除了Sam Roberts回答:要更改Jenkins的用户,请转到 计算机管理 <中的 服务 / strong>,找到Jenkins服务并从 属性 更改用户。