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 环境来测试它——你可能需要稍微调整一下。但我希望这可能是一个不错的起点。
我正在 运行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 环境来测试它——你可能需要稍微调整一下。但我希望这可能是一个不错的起点。