【问题标题】:Jenkins on Windows - Matlab Doesn't ExitWindows 上的 Jenkins - Matlab 不退出
【发布时间】:2017-12-10 08:01:19
【问题描述】:

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

【问题讨论】:

    标签: windows matlab jenkins build continuous-integration


    【解决方案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 没有使用许可用户。
    • 在 Win10 上,通过从浏览窗口中选择用户,服务的“以用户身份运行”字段的格式为 myuser@companydomain。不知何故,它导致了许可证错误,必须用companydomain\myuser替换。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-05-27
      • 1970-01-01
      • 2017-07-26
      • 2020-12-19
      • 2017-09-09
      • 2012-05-11
      • 1970-01-01
      • 2017-10-21
      • 1970-01-01
      相关资源
      最近更新 更多