如何在Jenkins控制台中获取Matlab输出

4
我正在尝试在 Windows 环境下将我的 MATLAB 单元测试集成到 Jenkins 中。我的问题是,即使是一个简单的 disp('Hello World!'),我也无法在 Jenkins 控制台中获取 MATLAB 输出。
我创建了一个 Jenkins free job 来执行以下批处理命令:matlab -nodisplay -r "disp('Hello World!');exit"
这是我的结果:
C:\Jenkins\jobs\runAllTests\workspace>matlab -nodisplay -r "disp('Hello World!');exit" 
C:\Jenkins\jobs\runAllTests\workspace>exit 0 
Finished: SUCCESS

当然,我想使用Jenkins来执行脚本运行多个单元测试。但问题是一样的,我无法捕获MATLAB的输出。
非常感谢提前任何帮助。
2个回答

4

我终于成功地在控制台中获取了Matlab的输出结果。 我遵循了@Guy Starbuck在@AndyCampbell博客中提到的提示:

start /wait matlab -nodesktop -nosplash -minimize -wait -r "disp('Hello World!');exit" -logfile unittestlog.txt
set output=%errorlevel%
MORE unittestlog.txt
EXIT %output%

谢谢大家的帮助。

听起来很好,我很高兴你已经开始运行了。那个弯引号的问题确实很顽固。另外,你抢先一步,但我本来要建议在批处理脚本中添加"type logfile",但你通过调用MORE unittestlog.txt得到了相同的结果。另一个有趣的方法是将-logfile选项直接指向Jenkins日志。就像 -logfile "%JENKINS_HOME%\jobs%JOB_NAME%\builds%BUILD_NUMBER%\log"。我尝试了一下,优点是它会在作业运行时输出信息。然而,它可能会与其他Jenkins作业的输出冲突。 - Andy Campbell
谢谢Andy,我会尝试这种方法。 - toto
运行正常 :) 感谢 @AndyCampbell - toto

2
你需要将-wait添加到MATLAB命令中。在Windows上,Jenkins将命令包装在一个批处理文件中,该文件立即返回并因此无法捕获输出(顺便说一句,即使MATLAB本身没有),它也始终以成功状态退出。
通过添加-wait,它将延迟退出直到MATLAB完成,并且还将返回适当的退出状态。
PS 还请参阅@AndyCampbell撰写的这个优秀的文章系列,其中介绍了如何将MATLAB与Jenkins集成。
编辑:
上述方法对我有效。 但是,以下是我设置时遇到的一些问题,也许它们对您也有帮助:
  1. 确保构建步骤是“执行Windows批处理命令”步骤而不是“执行Shell”步骤,因为在Windows上安装和运行UNIX实用程序很麻烦
  2. 确保MATLAB构建命令中使用了正确类型的引号。 它们需要是直引号,而不是弯引号-单引号和双引号都是这样
  3. 如果你将MATLAB构建命令复制并粘贴到Jenkins中,请确保没有意外复制任何额外的不可见字符-尝试直接在Jenkins中键入命令
  4. 确保没有许可问题-例如,Jenkins可能正在以user1的身份运行,并将MATLAB作为user1调用,但MATLAB的许可证是针对user2的。 在这种情况下使用-nodesktop 调用MATLAB时,它将无声失败(并且甚至可能留下一个僵尸MATLAB进程,其中有一个不可见的许可证错误对话框,您只能使用任务管理器退出)
  5. 为了协助故障排除,您可以将-logfile \path\to\logfile.txt 添加到MATLAB命令中,这可以诊断一些问题。 您还可以使用startup.m文件和/或finish.m文件-这些文件应在启动时运行(在构建命令之前)并在退出之前(在构建命令之后)运行。 最后,您可以尝试使用执行简单文件系统操作的构建命令,而不是disp(这将诊断整个MATLAB是否运行,或者仅仅是Jenkins是否收集其输出的问题)。

嗨,Sam,谢谢你的回答。我使用“-wait”选项得到了相同的结果。实际上,我已经在尝试遵循AndyCampbell的帖子(我同意这是非常好的)。 - toto
@toto,感谢你们的赞扬。toto,听起来像是Sam的回答让你开始了,是吗?请注意,您可能还对-logfile选项感兴趣,该选项将由MATLAB生成的日志文件重定向到一个文件中,该文件可以保存为Jenkins工件和/或打印到标准输出以直接包含在Jenkins日志中。 - Andy Campbell
@Andy,不,-wait选项不能解决我的问题,我仍然无法在相应的Jenkins作业控制台中看到Matlab输出(这里是“hello world”)。我知道-logfile选项。使用此选项,'hello world'会被写入文件中,但仍未在控制台中显示 :( - toto
@toto,对我来说它有效 - 抱歉。但请查看我的编辑以获取一些额外的可能提示。 - Sam Roberts
@Sam:再次感谢您的支持。不幸的是,这些点都没问题(也许第四个除外,但我不知道如何检查用户是否与Jenkins和MATLAB许可证相关联)。为了明确我的问题,我尝试使用脚本运行一些单元测试(就像安迪博客文章中描述的那样)。但是在Jenkins中看不到任何MATLAB输出,而且无论我的测试结果如何,Jenkins作业都正常。此外,我使用-logfile选项,但没有记录任何内容,而如果我在命令行中执行我的脚本,则正常工作。 - toto
@toto 这可能不是问题所在,但为了检查 Jenkins 正在运行的用户,您可以使用“开始”->“管理工具”->“服务”,向下滚动到 Jenkins,然后查看“登录为”列。如果它与 MATLAB 授权的用户不同,您可以右键单击它,选择“属性”,然后切换用户。之后您可能需要启动和停止 Jenkins。恐怕我没有其他建议 - 您可能需要从 Jenkins 专家那里获得帮助,而我只是一个 MATLAB 专家 :) - Sam Roberts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接