Gitlab CI与MATLAB

时间:2016-01-07 04:03:13

标签: matlab unit-testing gitlab-ci

我有gitlab CI运行测试一些脚本,我使用以下几行.gitlab-ci.yml来显示MATLAB构建的输出:

before_script:

test1:
 script:
   - matlab -nosplash -nodesktop -minimize -wait -logfile matlab-output.txt -r Model
   - type matlab-output.txt

当构建成功时,这种方法非常有效,但是当它失败时,因为第二个命令没有运行。我检查了gitlab-ci-runner,它没有'after_script'选项。你怎么解决这个问题?

注意:这是Windows。

5 个答案:

答案 0 :(得分:7)

我认为你的问题是双重的。部分原因是因为GITLAB没有调用你的type语句,而且MATLAB进程永远不会返回,因为脚本永远不会完成。

例如,在命令行键入以下内容:

# This one will fail and notice that it never ends
matlab -nodesktop -nosplash -minimize -wait -logfile log.txt -r 'disp(a); exit;'

这是因为MATLAB永远无法执行exit命令。

另一方面,在成功的情况下,它能够到达exit并因此返回。

# This one will pass
matlab -nodesktop -nosplash -minimize -wait -logfile log.txt -r 'disp(1); exit;'

我实际解决这个问题的方式是双重的。首先,我包装命令我尝试调用try / catch语句,然后将任何错误/异常转换为字符串格式并显示它们。

我在名为runtests.m

的文件中有这种事情
% runtests.m
exit_code = 0;

try
    Model
catch ME
    disp(getReport(ME))
    exit_code = 1;
end

% Ensure that we ALWAYS call exit
exit(exit_code);

然后我有一个bash脚本实际调用MATLAB并打印日志输出并返回从MATLAB返回的相同错误代码

# runtests.sh
LOGFILE=log.txt

matlab -nodesktop -nosplash -minimize -wait -logfile "$LOGFILE" -r 'runtests';
CODE=$?

cat "$LOGFILE"

exit $CODE

这里的额外好处是我的用户可以完全按照GITLAB CI在自己的机器上运行测试来运行测试。

然后我的.gitlab-ci.yml文件很简单

test1:
  script:
  - "runtests.sh"

答案 1 :(得分:2)

对于这个答案,我认为你的意思是matlab ...行失败,而type matlab-output.txt行没有运行。

由于我们不知道您的Model脚本/函数中有什么内容,但您可以尝试将其包装在try/catch中。

e.g。

matlab -nosplash -nodesktop -minimize -wait -logfile matlab-output.txt -r "try; Model; end;"

如果模型文件中有exit命令,则可能需要强制Matlab在错误时退出:

matlab -nosplash -nodesktop -minimize -wait -logfile matlab-output.txt -r "try; Model; catch; quit force; end;"

您也可以将try / catch放在Model.m文件

答案 2 :(得分:2)

据我了解你的问题,你想要在你输入失败时运行“type matlab-output.txt”。考虑到您有一个包含多行的作业,并且每个作业都可能失败,您所能做的就是创建第二个作业,或者即使发生故障也显然想要运行的后期作业。

例如,根据documentation,您可以拥有另一份可以随时运行的工作:

stages:
 - build
 - postbuild

before_script:

test1:
 stage: build
 script:
   - matlab -nosplash -nodesktop -minimize -wait -logfile matlab-output.txt -r Model
typematlab:
  stage: postbuild
  script:
   - type matlab-output.txt
  when: always

如果您有多个工作,我会建议您分阶段分离工作。

答案 3 :(得分:1)

您不能将CON用作输出文件吗?即。

matlab -nosplash -nodesktop -minimize -wait -logfile CON -r Model

答案 4 :(得分:1)

很抱歉长时间拖延,谢谢大家的帮助。我现在有一个使用Suever代码的运行系统。我修改它以适应MATLAB的Unit框架。

所以,最后我的.gitlab-ci.yml是:

before_script:

Model-01:
  script:
    - cd developers\testModel\01
    - Gitlab_CI_Hook.cmd

Model-02:
  script:
    - cd developers\testModel\02
    - Gitlab_CI_Hook.cmd

其中Gitlab_CI_Hook.cmd是:

matlab -nosplash -nodesktop -minimize -wait -logfile matlab-output.txt -r Git_MATLAB_interface
type matlab-output.txt

set content=
for /f "delims=" %%i in (ExitCode.txt) do set content=%content% %%i

exit %content%

和Git_MATLAB_interface.m

% assume it always fails
exit_code = 1;

% MATLAB runs the test
result = runtests(pwd)

% check the result
if result.Passed ~= 0 && result.Failed == 0 && result.Incomplete == 0
    exit_code = 0;
end

% write the ExitCode
fid = fopen('ExitCode.txt','w');
fprintf(fid,'%d',exit_code);
fclose(fid);

% Ensure that we ALWAYS call exit that is always a success so that CI doesn't stop
exit