我正在尝试使用GitLab CI在服务器上构建,测试和部署Express应用程序(Runner正在使用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。
答案 0 :(得分:0)
您在测试阶段开始后台作业永远不会终止 - 因此作业将永远运行。
GitLab CI作业的想法是短期运行的任务 - 比如编译,执行单元测试或收集代码覆盖率等信息 - 这些任务以预定义的顺序执行。在您的情况下,订单是build -> test -> deploy
;由于test
工作尚未完成,deploy
甚至无法执行。
根据您的环境,您必须为部署节点应用创建不同的作业。例如,您可以使用scp
之类的工具将构建输出推送到远程服务器,或将其上传到AWS;之后,您可以在url:
中的.gitlab-ci.yml
字段中引用最终到达网址。
答案 1 :(得分:0)
注意:当将gitlab运行程序与shell executor
通常,在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
,在其中运行使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进程。