Остановка запущенной фоновой службы (phantomjs) в gitlab-ci
Я запускаю phantomjs с определенными аргументами как часть моей работы.
Это работает на пользовательском сервере gitlab/gitlab-ci, я в настоящее время не использую контейнеры, я думаю, это упростит это.
Я начинаю phantomjs следующим образом:
- "timeout 300 phantomjs --ssl-protocol=any --ignore-ssl-errors=true vendor/jcalderonzumba/gastonjs/src/Client/main.js 8510 1024 768 2>&1 >> /tmp/gastonjs.log &"
Затем я запускаю свои тесты поведения, а затем снова останавливаю этот процесс:
- "pkill -f 'src/Client/main.js' || true"
Проблема заключается в том, что при выполнении теста соответствия не выполняется pkill, и тестовый запуск завершается, ожидая завершения phantomjs. Я уже добавил тайм-аут 300, но это означает, что я все еще жду 2 минуты после сбоя, и он в конечном итоге остановит его, пока тест все еще работает, когда они становятся достаточно медленными.
Я не нашел способ запустить какую-либо команду после запуска/очистки, которая также работает в случае сбоя.
Есть ли лучший способ сделать это? Могу ли я запустить phantomjs так, чтобы gitlab-ci не заботился о том, чтобы он все еще работал? может быть, нет?
Ответы
Ответ 1
Как намекнул, в основном моя проблема заключалась не в том, что я не мог убить этот процесс, он запускал мой тест script, и он не остановился в этой точке, что привело к тупиковой ситуации.
Я уже делал что-то очень похожее на пример из @Rufinus, но это просто не сработало для меня. Могут быть несколько разных вещей, например, разные способы запуска тестов или их запуск или запуск в before_script, что не является для меня вариантом.
Я нашел способ заставить его работать для меня, что должно было помешать моему тестовому бегущему прекратить выполнение дополнительных задач. Мне удалось сделать это с помощью "set + e", а затем сохранить код выхода (что-то, что я пытался сделать раньше, но это не сработало).
Это важная часть моей работы:
# Set option to prevent gitlab from stopping if behat fails.
- set +e
- "phantomjs --ssl-protocol=any --ignore-ssl-errors=true vendor/jcalderonzumba/gastonjs/src/Client/main.js 8510 1024 768 2>&1 >> /dev/null &"
# Store the exit code.
- "./vendor/bin/behat -f progress --stop-on-failure; export TEST_BEHAT=${PIPESTATUS[0]}"
- "pkill -f 'src/Client/main.js' || true"
# Exit the build
- if [ $TEST_BEHAT -eq 0 ]; then exit 0; else exit 1; fi
Ответ 2
TL; DR; - создайте процесс в новом потоке с помощью &
, но затем вы должны убедиться, что процесс был убит при успешных и сбоях.
Я использую это (с комментариями):
'E2E tests':
before_script:
- yarn install --force >/dev/null
# if there is already an instance running kill it - this is ok in my case - as this is not run very often
- /bin/bash -c '/usr/bin/killall -q lite-server; exit 0'
- export DOCKERHOST=$(ifconfig | grep -E "([0-9]{1,3}\\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d ':' | head -n1)
- export E2E_BASE_URL="http://$DOCKERHOST:8000/#."
# start the lite-server in a new process
- lite-server -c bs-config.js >/dev/null &
script:
# run the tests
- node_modules/.bin/protractor ./protractor.conf.js --seleniumAddress="http://localhost:4444/wd/hub" --baseUrl="http://$DOCKERHOST:8000" --browser chrome
# on a successfull run - kill lite server
- killall lite-server >/dev/null
after_script:
# when a test fails - try to kill it in the after_script. this looks rather complicated, but it makes sure your builds dont fail when the tests succeedes and the lite-server is already killed. to have a successfull build we ensure a non-error return code (exit 0)
- /bin/bash -c '/usr/bin/killall -q lite-server; exit 0'
stage: test
dependencies:
- Build
tags:
- selenium
https://gist.github.com/rufinus/9ee8f04fc1f9248eeb0c73ad5360a006#file-gitlab-ci-yml-L7
Ответ 3
попробуйте -9
сигнал:
- "pkill -9 -f 'src/Client/main.js' || true"
Вы также можете попробовать другой signlas, вы можете найти список здесь