2017-05-22 17 views
14

Tôi đang bắt đầu các ảo ảnh với các đối số cụ thể như một phần công việc của tôi.Dừng dịch vụ nền bắt đầu (phantomjs) trong gitlab-ci

Điều này đang chạy trên máy chủ gitlab/gitlab-ci tùy chỉnh, tôi hiện không sử dụng vùng chứa, tôi đoán điều đó sẽ đơn giản hóa điều đó.

tôi bắt đầu phantomjs như thế này:

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

Sau đó, tôi đang chạy thử nghiệm behat của tôi, và sau đó tôi dừng quá trình đó một lần nữa:

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

Vấn đề là khi một kiểm tra behat thất bại, sau đó nó không thực hiện các pkill và chạy thử nghiệm đang bị mắc kẹt chờ đợi trên phantomjs để kết thúc. Tôi đã thêm thời gian chờ 300 nhưng điều đó có nghĩa là tôi vẫn đang đợi 2 phút sau khi thất bại và cuối cùng nó sẽ dừng nó trong khi thử nghiệm vẫn chạy khi chúng đủ chậm.

Tôi chưa tìm thấy cách để chạy một số loại lệnh sau khi chạy/dọn dẹp cũng chạy trong trường hợp không thành công.

Có cách nào tốt hơn để thực hiện việc này không? Tôi có thể bắt đầu phantomjs theo cách mà gitlab-ci không quan tâm rằng nó vẫn đang chạy? nohup có thể?

Trả lời

2

Như được gợi ý, về cơ bản, prob của tôi lem không phải là tôi không thể giết chết quá trình, đó là chạy kịch bản thử nghiệm của tôi và nó không dừng lại ở thời điểm đó, dẫn đến một bế tắc.

Tôi đã làm điều gì đó khá giống với ví dụ từ @Rufinus, nhưng nó không hoạt động đối với tôi. Có thể có một vài điều khác nhau, giống như cách chạy thử nghiệm khác nhau hoặc như vậy hoặc bắt đầu nó trong before_script, mà không phải là một lựa chọn cho tôi.

Tôi đã tìm cách để làm cho nó hoạt động cho tôi, đó là để ngăn chặn Á hậu thử nghiệm của tôi ngừng việc thực hiện các nhiệm vụ tiếp theo. Tôi quản lý để làm điều đó với một "set + e" và sau đó lưu trữ các mã thoát (một cái gì đó tôi đã cố gắng làm trước nhưng nó đã không làm việc).

Đây là phần có liên quan từ công việc của tôi:

# 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; - sinh ra quy trình trong một luồng mới với & nhưng sau đó bạn phải chắc chắn rằng quá trình này bị giết trong các bản dựng thành công và thất bại.

tôi sử dụng này (có ý kiến):

'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

Cảm ơn đã phản ứng bằng cách nào đó nhưng điều này không làm việc cho tôi, nó không bao giờ bắt đầu sau khi kịch bản đến khi quá trình phantomjs chạy. Tôi đã thử nohup, không thay đổi gì cả. Ngay sau khi tôi bắt đầu quá trình, cũng bằng cách thực hiện thủ công, nó tiếp tục và sau đó chạy các tập lệnh sau nhưng không chạy trước đó. – Berdir

+0

bạn có thể bắt đầu dịch vụ nền với nohup không? –

+0

chỉ sinh ra quy trình trong một chuỗi mới với '&' xem https: //gist.github.com/rufinus/9ee8f04fc1f9248eeb0c73ad5360a006 # file-gitlab-ci-yml-L7 cho một ví dụ – Rufinus

0

thử tín hiệu:

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

Bạn có thể thử signlas khác là tốt, bạn có thể tìm thấy một danh sách here

+0

Vấn đề không phải là pkill không hoạt động, nó hoạt động tốt. Nhưng gitlab không thực hiện nó. – Berdir

Các vấn đề liên quan