gpt4 book ai didi

node.js - GitLab CI 卡在正在运行的 NodeJS 服务器上

转载 作者:太空宇宙 更新时间:2023-11-03 21:52:47 32 4
gpt4 key购买 nike

我正在尝试使用 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 运行器和 shell 执行器时,解决方案工作正常

通常,在 Gitlab CI 中,我们运行具有特定任务的有序作业,这些任务应在另一个任务结束后执行。

因此,对于作业 build,我们有 npm install -q 命令运行并以退出状态终止(如果命令成功,则为 0 退出状态),然后运行下一个命令npm run build,依此类推,直到作业终止。

对于 test 作业,我们有 npm start & 进程持续运行,因此该作业将无法终止。

问题是,有时我们需要一些进程需要在后台运行,或者一些进程在任务之间保持事件状态。例如,在某种测试中,我们需要保持服务器运行,例如:

test:
stage: test
script:
- npm start
- npm test

在这种情况下,npm test 将永远不会启动,因为 npm statrt 继续运行而不终止。

解决方案是使用 before_script 我们运行一个 shell 脚本来保持 npm start 进程运行,然后我们调用 after_script 来终止该npm启动流程

所以我们在 .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 测试的工作.

npm test 终止并传递到之后的脚本,我们在其中杀死所有 Nodejs 进程。

关于node.js - GitLab CI 卡在正在运行的 NodeJS 服务器上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49013751/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com