簡體   English   中英

GitLab CI卡在運行NodeJS服務器上

[英]GitLab CI stuck on running NodeJS server

我正在嘗試使用GitLab CI在服務器上構建,測試和部署Express應用程序(運行程序與Shell執行程序一起運行)。 但是, test:asyncdeploy_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.ymlurl:字段中引用最終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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM