Jenkins on Windows - Matlab 不会退出



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);

我的猜测是这是一个许可问题 - 您需要 Jenkins 以 MATLAB 许可证中指定的同一用户身份运行(当然,假设您的 MATLAB 许可证是指定用户许可证 - 如果它是并发或命名机器许可证,请忽略我)。

如果是错误的用户,则 MATLAB 将启动,但会显示一个对话框,告诉您许可问题。但是,由于您已经用-nodesktop调用了它,因此此对话框将不可见,然后 MATLAB 将作为"僵尸"进程永远闲逛,而不会向 Jenkins 发送返回值。如果您进入任务管理器,您可能会发现您有一个或多个它们挂在那里,您可以在那里强制退出它们。

请注意,如果您通过 Jenkins 运行 MATLAB 进行单元测试或自动生成,则应注意许可要求。如果您有指定用户许可证,则只允许该指定用户使用它,其中包括通过 Jenkins。只要你是唯一可以启动 Jenkins/MATLAB 工作的人,那很好 - 但如果你将 Jenkins 暴露给多个用户,他们都可以启动 MATLAB 工作,你就违反了许可协议。如果你需要这样做,你应该真正获得一个并发许可证,让 Jenkins 运行。但这有点灰色地带,您可能需要与客户经理讨论。

希望对您有所帮助!


编辑:我想您可能还想看看您在测试脚本中使用的退出代码。您希望 MATLAB 在测试通过时以零成功代码退出,在测试失败或测试期间发生错误时以非零失败代码退出。所以你可能希望你的最后一行是exit(any([results.Failed]));,而不是exit(any([results.Failed])+1);

问题与许可有关。Jenkins 应该由拥有 Matlab 许可证的同一用户运行。

除了 Sam Roberts 的回答:要更改 Jenkins 的用户,请转到计算机管理中的服务,找到 Jenkins服务并从属性中更改用户。

最新更新