Найти тему

Gitlab-ci. Job's log exceeded limit и no more output will be collected. Что делать?

Как я уже писала, для прогона автотестов мы используем gitlab-ci + Cucumber Studio.

Пайплайн состоит из трех стадий:

download: скачивание нужных сценариев из Студии;

run: запуск команды, которая прогоняет тесты;

push: обновление статусов тестов в тест-ране в Студии по результатам прогона.

После того, как мы перешли с задолбавшего Селениум Грид на божественный Selenosis, тесты реально начали работать. Но возникла еще одна проблема. При запуске достаточного большого набора тестов, на стадии run мы получали следующую ошибку:

После чего работа этой конкретной стадии продолжалась, а вот увидеть ее результаты в Студии надежды уже не было. А значит не было никакого смысла и в самом прогоне.

Было решено обойти это проблему перенаправлением лога в файл.

-2

После несколько часов ресерча (я тот еще работник с командной строкой), я нашла как это делается.

Мы просто добавляем в конце команды запускающей тесты значок ">" и имя лога. Я решила называть лог по айди пайплайна. Можно по айди джобы и вообще как угодно.

Итак, я получила:

script:
- env

- gradle cucumberci 2>log_$CI_PIPELINE_ID.err > log_$CI_PIPELINE_ID.txt (записываем логи в файл)
- mv log_$CI_PIPELINE_ID.txt /folder/reports/
(переносим файлы в нужные каталоги)
- mv log_$CI_PIPELINE_ID.err /folder/reports/
artifacts:
expire_in: 3 days
when: always

paths:
- /folder/reports/log_$CI_PIPELINE_ID.txt
(сохраняем логи в архив с артефактами)
- /folder/reports/log_$CI_PIPELINE_ID.err

Проверила, как это работает на одном сценарии. Все работало прекрасно: лог переносился в нужную папку и сохранялся в артефактах джобы.

А потом я проверила это на ране из нескольких сценариев и... Не сработало!

Но дело было не в количестве сценариев, а в том, что в этом наборе мне попался сценарий, который упал. А если упал хоть один сценарий, считается упавшей вся джоба и все шаги, что шли после команды gradle cucumberci просто не выполнялись. Поэтому лог-то записывался, а вот в нужные папки он уже не переносился. И на экране джобы я видела вот такое:

Uploading artifacts for failed job

WARNING: /folder/reports/log_60604.txt: no matching files

WARNING: /folder/reports/log_60604.err: no matching files

ERROR: Job failed: exit code 1

Еще несколько часов ресерча, пока я не догадалась погуглить что-то типа "как продолжить работу джобы, если она упала" и - вот оно решение!

script:
- env

- gradle cucumberci 2>log_$CI_PIPELINE_ID.err > log_$CI_PIPELINE_ID.txt || FAILED=true (добавляем переменную, которая будет нам сигнализировать, что джоба упала)
- (if [ $FAILED ]; then mv log_$CI_PIPELINE_ID.txt /folder/reports/; mv log_$CI_PIPELINE_ID.err /folder/reports/ ; fi)
(если джоба упала, то делаем все тоже самое, как если бы она не упала)
- mv log_$CI_PIPELINE_ID.txt /folder/reports/
(остальные шаги без изменений)
- mv log_$CI_PIPELINE_ID.err /folder/reports/
artifacts:
expire_in: 3 days
when: always

paths:
- /folder/reports/log_$CI_PIPELINE_ID.txt
- /folder/reports/log_$CI_PIPELINE_ID.err

Теперь проблема с запуском больших наборов у нас практически решилась. Практически, потому что очень большие наборы бегут у нас больше 5 часов. А на время тоже стоит ограничение. Но ограничение по времени можно менять с помощью специально предназначенных для этого людей: админов. Чем мы наверное и займемся. Или возможно стоить пристальнее всмотреться в наши тесты и выяснить, почему они занимают столько времени. Но это уже тема другой статьи.

Надеюсь, что кому-то окажется полезным.