[英]GitLab CI stuck on running NodeJS server
我正在嘗試使用GitLab CI在服務器上構建,測試和部署Express應用程序(運行程序與Shell執行程序一起運行)。 但是, test:async
和deploy_staging
作業不會終止。 但是,當檢查GitLab內的終端時,Express服務器確實會啟動。 是什么賦予了 ?
stages:
- build
- test
- deploy
### Jobs ###
build:
stage: build
script:
- npm install -q
- npm run build
- knex migrate:latest
- knex seed:run
artifacts:
paths:
- build/
- node_modules/
tags:
- database
- build
test:lint:
stage: test
script:
- npm run lint
tags:
- lint
# Run the Express server
test:async:
stage: test
script:
- npm start &
- curl http://localhost:3000
tags:
- server
deploy_staging:
stage: deploy
script:
- npm start
environment:
name: staging
url: my_url_here
tags:
- deployment
npm start
只是node build/bundle.js
。 構建腳本正在使用Webpack。
您正在測試階段啟動一個永遠不會終止的后台作業,因此該作業將永遠運行。
GitLab CI作業的想法是短期運行的任務,例如編譯,執行單元測試或收集諸如代碼覆蓋率之類的信息,這些任務以預定義的順序執行。 在您的情況下,順序為build -> test -> deploy
; 由於test
工作尚未完成,因此甚至不會執行deploy
。
根據您的環境,您將不得不創建其他作業來部署節點應用程序。 例如,您可以使用諸如scp
類的工具將構建輸出推送到遠程服務器,或者將其上傳到AWS。 之后,您可以在.gitlab-ci.yml
的url:
字段中引用最終URL。
注意:將gitlab Runner與shell executor
一起使用時,解決方案可以正常工作
通常,在Gitlab CI中,我們運行帶有特定任務的有序作業,這些任務應在另一任務結束后執行。
因此,對於作業build
我們有npm install -q
命令,該命令運行並以退出狀態終止(如果命令成功,則退出狀態為0),然后運行下一個命令npm run build
,依此類推,直到作業終止。
對於test
作業,我們有npm start &
process保持運行,因此該作業將無法終止。
問題在於,有時我們需要某個需要在后台運行的流程,或者某個需要在任務之間運行的流程。 例如,在某種測試中,我們需要保持服務器運行,如下所示:
test:
stage: test
script:
- npm start
- npm test
在這種情況下, npm test
將永遠不會開始,因為npm statrt
會繼續運行而不會終止。
解決方案是使用before_script
,在此我們運行使npm start
進程保持運行的shell腳本,然后調用after_script
殺死該npm start
進程。
所以在我們的.gitlab-ci.yml中,我們寫
test:
stage: test
before_script:
- ./serverstart.sh
script:
- npm test
after_script:
- kill -9 $(ps aux | grep '\snode\s' | awk '{print $2}')
並在serverstart.sh上
# !/bin/bash
# start the server and send the console and error logs on nodeserver.log
npm start > nodeserver.log 2>&1 &
# keep waiting until the server is started
# (in this case wait for mongodb://localhost:27017/app-test to be logged)
while ! grep -q "mongodb://localhost:27017/app-test" nodeserver.log
do
sleep .1
done
echo -e "server has started\n"
exit 0
多虧了serverstart.sh
腳本的終止,同時使npm start
進程保持活動狀態,並通過轉移到我們進行npm test
的工作來幫助我們。
npm test
終止並傳遞到after腳本,在此我們殺死所有nodejs進程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.