Jenkins - 如何保持 Matlab 预热

Jenkins - How To Keep Matlab Warmed Up

我正在 运行ning Jenkins 进行一个用 Matlab 编写的项目。我的构建脚本使用 运行 构建脚本的必要参数启动 Matlab 并退出。

由于 Matlab 是一种解释型语言,连续的 运行 速度要快得多,所以我正在努力寻找一种方法来 运行 Matlab 并保持开放状态以供将来测试。

我也不认为这个问题只与Matlab有关,Java也是一样。

所以问题是:有没有办法让进程(在我的例子中是 Matlab)保持打开状态以供将来测试 运行s?

欢迎回答有关 Java 或其他解释语言的解决方案。

免责声明:我从未尝试过以下建议,并且可能存在我没有考虑到的困难。但我认为它可能会起作用。

我认为您应该能够使用 Python(R2014b 及更高版本)的 MATLAB 引擎或 Java(R2016b 及更高版本)的 MATLAB 引擎。

与其每次 运行 Jenkins 作业都启动 MATLAB,不如使用 matlab -r 'matlab.engine.shareEngine' 启动一次。这将在启动时 运行 MATLAB 命令 matlab.engine.shareEngine,使 MATLAB 可用于来自 Python 或 Java.

的连接

然后您的 Jenkins 作业可以 运行 一个小的 Python or Java 脚本,它将连接到 运行ning MATLAB 会话,执行您的测试代码,清除并断开与 MATLAB 的连接。

您需要确保将结果从 MATLAB 传回 Python/Java 以指示您的测试是通过还是失败,然后导致 Python/Java 退出并返回状态代码反映这一点,以便 Jenkins 知道 success/failure.

您还需要注意在每个 运行 结束时进行清理,否则 MATLAB 最终会在测试 运行 之间共享状态。并且您还需要确保您的测试 运行 永远不会使 MATLAB 崩溃(或者有某种方法来监视它并在它确实崩溃时将其恢复)。


编辑:请求的示例。

因此(假设您有一个 MATLAB 运行ning 会话,已如上所述设置为共享)您可以从 Python 和 [=48= 连接到 MATLAB ] 你的测试,使用类似下面的东西:

import matlab.engine
eng = matlab.engine.connect_matlab()
import StringIO
out = StringIO.StringIO()
err = StringIO.StringIO()
ret = eng.runmytests(nargout=1,stdout=out,stderr=err)
print(out.getvalue())
print(err.getvalue())
if ret:
    sys.exit(0)
else:
    sys.exit(1)

注意 eng.runmytests。您在这里调用了一个 MATLAB 函数 runmytests。您可能希望实现一个 MATLAB 函数 runmytests.m 来执行如下操作:

function output = runmytests
import matlab.unittest.TestSuite;
try
    suite = TestSuite.fromPackage('testcases','IncludingSubpackages',true);
    results = run(suite);
    display(results);
catch e
    display(getReport(e,'extended'));
    output = false;
    return
end
output = ~any([results.Failed]);

上面的例子还没有完全解决;恐怕我的机器上现在没有 Python 环境来测试它——你可能需要稍微调整一下。但我希望这可能是一个不错的起点。