2017-05-22 53 views
14

Zaczynam od phantomjs z określonymi argumentami jako częścią mojej pracy.Zatrzymywanie usługi uruchomionej w tle (phantomjs) w gitlab-ci

To działa na niestandardowym serwerze gitlab/gitlab-ci, obecnie nie używam kontenerów, chyba to by to uprościło.

Zaczynam phantomjs tak:

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

Potem biegnę moich testów behat, a następnie ja znowu zatrzymanie tego procesu:

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

Problem jest wtedy, gdy test behat nie powiedzie się, to nie wykona pkill i test-run utknął czekając na phantomjs, aby zakończyć. Dodałem już limit czasu 300, ale oznacza to, że wciąż oczekuję około 2 minut po niepowodzeniu i w końcu go zatrzymam, dopóki test będzie nadal działał, gdy będą wystarczająco powolne.

Nie znalazłem sposobu uruchomienia jakiegoś polecenia po uruchomieniu/czyszczenia, które również działa w przypadku niepowodzenia.

Czy jest lepszy sposób to zrobić? Czy mogę uruchomić phantomjs w taki sposób, że gitlab-ci nie dba o to, że nadal działa? nohup może?

Odpowiedz

2

Jak zasugerowano, w zasadzie mój problem lem nie polegał na tym, że nie mogłem zabić tego procesu, to jest uruchamianie mojego skryptu testowego i jego niepowodzenie zatrzymało się w tym momencie, powodując impas.

Już robiłem coś bardzo podobnego do przykładu z @Rufinus, ale to po prostu mi nie pasowało. Może być kilka różnych rzeczy, na przykład inny sposób uruchamiania testów lub uruchamiania go w before_script, co nie jest dla mnie opcją.

Znalazłem sposób, aby zadziałało, co miało uniemożliwić biegaczowi testowemu przerwanie wykonywania dalszych zadań. Udało mi się to zrobić za pomocą "set + e", a następnie zapisać kod wyjścia (coś, co próbowałem zrobić wcześniej, ale to nie zadziałało).

Jest odpowiednia część z mojej pracy:

# 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 
3

TL; DR; - spawn proces w nowym wątku z &, ale musisz upewnić się, że proces zostanie zabity w kompilacjach udanych i niepowodzeń.

Używam tego (z komentarzem):

'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

+0

Dzięki za odpowiedzi, ale jakoś to nie działa dla mnie, to nigdy nie rozpoczyna się po skrypcie, aż proces phantomjs biegnie. Próbowałem nohup, niczego nie zmieniłem. Natychmiast po przeprowadzeniu procesu, również ręcznie, kontynuuje, a następnie uruchamia skrypty końcowe, ale nie wcześniej. – Berdir

+0

możesz uruchomić usługę w tle za pomocą nohup? –

+0

właśnie odradza proces w nowym wątku z '&' zobacz https: //gist.github.com/rufinus/9ee8f04fc1f9248eeb0c73ad5360a006 # file-gitlab-ci-yml-L7 na przykład – Rufinus

0

spróbować sygnał:

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

Można spróbować innych signlas jak dobrze, można znaleźć listę here

+0

Problemem nie jest to, że pkill nie działa, działa dobrze. Ale gitlab nie wykonuje tego. – Berdir