2016-01-07 5 views
4

У меня есть gitlab CI работает тестирование несколько сценариев, и я использовал следующие строки .gitlab-ci.yml, чтобы показать вывод MATLAB сборки:Gitlab CI с 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.

+0

Боюсь для использования опции -nojvm, упомянутой, потому что многие из используемых нами скриптов имеют графику. –

+0

Является ли сценарий Model записывающим файл matlab-output. txt, несмотря на провал? – Markon

ответ

0

Извините за долгую задержку и спасибо всем остальным за помощь. Теперь у меня есть работающая система, использующая код Suever. Я изменил его, чтобы соответствовать структуре подразделения MATLAB.

Итак, наконец, мой .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 
1

Не можете ли вы использовать CON в качестве выходного файла? То есть

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

Это ничем не отличается от того, как я делаю вещи –

2

Для этого ответа я предполагаю, вы имеете в виду, что matlab ... линии терпит неудачу и этот type matlab-output.txt линия не запускается.

Поскольку мы не знаем, что в вашем скрипте/функции Model, но вы можете попробовать обернуть его в try/catch.

например.

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

Вы также можете поставить попробовать/поймать в файле Model.m

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

Я думаю, что ваша проблема в два раза. Частично это объясняется тем, что 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); 

Тогда у меня есть Баш скрипт, который на самом деле делает вызов 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" 
+0

Спасибо, что исправил мою проблему. –