2016-07-28 70 views
2

我有一个gitlab ci的设置,我想要在本地启动一个本地npm服务器进行测试。我.gitlab-ci.yml是这样的:Gitlab持续集成npm后台进程

stages: 
    - setup 
    - build 
    - test 

cache: 
    paths: 
    - venv/ 
    - node_modules/ 

setup_nvm: 
    stage: setup 
    script: 
    - "echo installing npm and phantomJS via nvm" 
    - "git clone https://github.com/creationix/nvm.git ~/.nvm && cd ~/.nvm && git checkout `git describe --abbrev=0 --tags`" 
    - ". ~/.nvm/nvm.sh" 
    - "nvm install 5.0" 
    - "nvm use 5.0" 
    - "npm install" 
    - "nohup npm run dev &" # HERE I TRY TO RUN THE SERVER IN THE BACKGROUND 

setup_python: 
    stage: setup 
    script: 
    - "echo installing python dependencies in virtual environment" 
    - "[ ! -d venv ] && virtualenv -p python3 venv" 
    - "source venv/bin/activate" 
    - "pip3 install -r requirements.txt" 

build_multilang: 
    stage: build 
    script: 
    - "[ ! -d tu9onlinekurstest ] && make -f tools/makefiles/multilang" 

do_tests: 
    stage: test 
    script: 
    - "cd src/test" 
    - "python -m unittest" 

但是这项工作就停止并setup_python是从来没有开始,在状态pending永远。我认为这些工作会并行执行(根据gitlab runner docs)。你有使用gitlab runner运行后台任务的经验吗?

+1

乔布斯没有设计这一点,看看['services'](http://docs.gitlab.com/ce/ ci/docker/using_docker_images.html#how-to-use-other-images-as-services) – Martin

+0

@mgansler看起来像提问者没有使用docker。所以'服务'不能解决问题。 – Fairy

回答

1

Tomasz Maczukina related GitLab issue

我认为最好的解决办法是使用一些服务经理 (systemd,runit,暴发户,SYSV - 无论是目前该系统上)。

在服务器上,您应该准备配置文件以启动 服务。然后在CI工作中,你会做例如systemctl start tomcat。这个 命令预计会在调用之后退出,它的服务 管理员(Runner范围之外)负责启动该进程。

即使您在最后添加nohup&时也使用Runner启动进程,但会标记进程组标识。工作完成时Runner为 向整个进程组发送kill信号。因此,直接从CI作业开始的任何进程 将在作业结束时终止。使用服务 经理,您不是在Runner的工作环境中启动该流程。 你只通知管理员使用开始的方法制备 配置:)

+0

为什么这会降低投票率?我知道这并不能解释为什么亚军在这种情况下挂起,票也没有 - 但没有评论的downvote似乎没有必要。 – steinar

+0

我可以确认设置服务并使用例如systemctl改为按预期工作。所以,从我+1。 (仍然想知道为什么构建挂在这上面,但建立一个服务,而不是使用'&'运行的''在任何情况下推着它在后台看起来更明智)。 – steinar

+0

@steinar赛跑者挂起的原因是它的第一份工作“setup_nvm”不会退出,即使它是用“nohup ..&”执行的,gitlab runner仍然按照进程组进行监控。 – fatfatson