файл gitlab-ci yaml не вернет сбой при -1

#gitlab-ci #gitlab-ci-runner

#gitlab-ci #gitlab-ci-runner

Вопрос:

Я завершаю свой тестовый шаг простым скриптом, который сканирует вывод pytest.журнал и должен завершиться с -1 в случае сбоя, поэтому задание становится красным, а не зеленым:

   scripts:
    - lots of test steps
    - bash -c -l "python bin/status.py --statusfile=output.log; exit $?"
  

Но gitlab-ci-runner возвращает 0:

 20200930123055|ERROR|bin/status.py:53|failed in line:173 
'========================= 2 failed, 5 passed in 16.91s =========================' so returning -1 to shell
Uploading artifacts for successful job
00:01
Uploading artifacts...
output.log: found 1 matching files and directories 
Uploading artifacts as "archive" to coordinator... ok  id=2750517 responseStatus=201 Created token=5Gh42zsB
Job succeeded
  

программа возвращает правильный код выхода:

 python.exe .binstatus.py --statusfile=C:usersmobjDownloadsoutput.log 
20200930124542|ERROR|.binstatus.py:53|failed in line:99 '=================== 1 failed, 5 passed, 1 skipped in 16.20s ====================' so returning -1 to shell
$?
False
python.exe .binstatus.py --statusfile=C:usersmobjDownloadsoutput2.log 
$?
True
  

Я попытался использовать bin/status.py --statusfile=output.log in sh, но этот файл с жалобами не найден.

Ответ №1:

Я обнаружил ошибку, оказывается ;exit $? , что перенос in bash возвращается только к текущему экземпляру

 $ /bin/bash -c -l "./bin/status.py --statusfile=/mnt/c/Users/mobj/Downloads/output.log --debug; exit $?"
20200930142836|ERROR|./bin/status.py:53|failed in line:99 '=================== 1 failed, 5 passed, 1 skipped in 16.20s ====================' so returning -1 to shell
$ echo $?
0
  

Поэтому простое удаление ;exit $? делает его правильным:

  /bin/bash -c -l "./bin/status.py --statusfile=/mnt/c/Users/mobj/Downloads/output.log --debug"
20200930142754|ERROR|./bin/status.py:53|failed in line:99 '=================== 1 failed, 5 passed, 1 skipped in 16.20s ====================' so returning -1 to shell
$ echo $?
255