Остановка запущенной фоновой службы (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, вы можете найти список здесь