matlab - 使用 MATLAB 的 Gitlab CI

标签 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。

最佳答案

我认为您的问题有两个方面。部分原因是 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 命令。

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

# 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"

关于matlab - 使用 MATLAB 的 Gitlab CI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34647154/

相关文章:

matlab - 在 Matlab 中随机选择所有可能组合的子集?

matlab - 矩阵内的操作避免循环

unit-testing - 如何在 Golang 代码中测试 filepath.Abs​​ 失败?

unit-testing - 单元测试Angular 5-期望对话框关闭

javascript - 使用 sinon 进行 Node 、单元测试和模拟

c - Mex 稀疏矩阵

matlab - 修改结构的最快方法

amazon-web-services - AWS ElasticBeanstalk 从 Gitlab 注册表中提取 Docker 镜像

gitlab - 在 gitlab 管道中使用 semver 或时间戳

django - Docker:从Web容器内部执行将django迁移到db容器