Как я уже писала, для прогона автотестов мы используем gitlab-ci + Cucumber Studio.
Пайплайн состоит из трех стадий:
download: скачивание нужных сценариев из Студии;
run: запуск команды, которая прогоняет тесты;
push: обновление статусов тестов в тест-ране в Студии по результатам прогона.
После того, как мы перешли с задолбавшего Селениум Грид на божественный Selenosis, тесты реально начали работать. Но возникла еще одна проблема. При запуске достаточного большого набора тестов, на стадии run мы получали следующую ошибку:
После чего работа этой конкретной стадии продолжалась, а вот увидеть ее результаты в Студии надежды уже не было. А значит не было никакого смысла и в самом прогоне.
Было решено обойти это проблему перенаправлением лога в файл.
После несколько часов ресерча (я тот еще работник с командной строкой), я нашла как это делается.
Мы просто добавляем в конце команды запускающей тесты значок ">" и имя лога. Я решила называть лог по айди пайплайна. Можно по айди джобы и вообще как угодно.
Итак, я получила:
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 часов. А на время тоже стоит ограничение. Но ограничение по времени можно менять с помощью специально предназначенных для этого людей: админов. Чем мы наверное и займемся. Или возможно стоить пристальнее всмотреться в наши тесты и выяснить, почему они занимают столько времени. Но это уже тема другой статьи.
Надеюсь, что кому-то окажется полезным.