在gitlab-ci中停止已启动的后台服务(phantomjs)

时间:2017-05-22 12:13:36

标签: gitlab gitlab-ci

作为我工作的一部分,我正在开始使用特定论点的幻影。

这是在自定义的gitlab / gitlab-ci服务器上运行的,我目前没有使用容器,我想这会简化它。

我正在开始像这样的幻影:

- "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 &"

然后我正在运行我的behat测试,然后我再次停止该过程:

- "pkill -f 'src/Client/main.js' || true"

问题是当behat测试失败时,它不执行pkill并且测试运行等待phantomjs完成。我已经添加了超时300,但这意味着我现在仍然在等待2分钟后失败并且当测试仍然在运行时它们会变得足够慢时最终会停止它。

我还没有找到一种运行某种运行后/清理命令的方法,该命令也会在失败的情况下运行。

有更好的方法吗?我可以用gitlab-ci不关心它仍在运行的方式启动phantomjs吗?也许nohup?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

正如所暗示的那样,基本上我的问题并不是我无法杀死这个过程,而是运行我的测试脚本并且在那时停止失败,导致死锁。

我已经做了一些与@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 :(得分:0)

尝试-9信号:

- "pkill -9 -f 'src/Client/main.js' || true"

您也可以尝试其他签名,您可以找到列表here