Gitlab持续集成npm后台进程

时间:2016-07-28 11:25:03

标签: npm gitlab gitlab-ci-runner

我有一个gitlab ci的设置,我想在后台启动本地npm服务器进行测试。我的.gitlab-ci.yml就像:

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运行后台任务的经验吗?

2 个答案:

答案 0 :(得分:3)

根据Tomasz Maczukin上的a related GitLab issue

  

我认为最好的解决方案是使用一些服务管理器   (systemd,runit,upstart,sysv - 此系统上存在的任何内容)。

     

在服务器上,您应准备配置文件以启动   服务。然后在CI工作中你会做,例如systemctl start tomcat。这个   命令预计在呼叫及其服务后立即退出   开始这个过程的经理(在Runner的范围之外)。

     

使用Runner开始的流程,即使您在末尾添加nohup&,也会使用流程组ID进行标记。当工作完成后,Runner就是   向整个进程组发送kill信号。所以任何过程都开始了   直接来自CI工作将在工作结束时终止。使用服务   经理你没有在Runner的工作环境中开始这个过程。   您唯一通知经理使用准备好开始流程   配置:)

答案 1 :(得分:1)

这里是使用systemd服务管理器在后台运行进程的示例。

在此示例中,Gitlab CI / CD将在Ubuntu上运行的HTTP服务器中部署React Web应用。

步骤1:在运行器上,创建服务单元文件

vi /etc/systemd/system/hello-react.service

[Unit]
Description=Hello React service
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=always
RestartSec=1
User=gitlab-runner
ExecStart=npx http-server -p 3000 /home/gitlab-runner/hello-react/

[Install]
WantedBy=multi-user.target

步骤2:在运行程序上,将sudo的权限授予用户gitlab-runner,而没有密码限制。

$ sudo usermod -a -G sudo gitlab-runner
$ sudo visudo

现在将以下行添加到文件底部

gitlab-runner ALL=(ALL) NOPASSWD: ALL

步骤3:在您的代码存储库中,创建deploy.sh

#!/bin/bash

echo "Build the app for production"
npm run build

echo "Copy over the build"
rm -fr /home/gitlab-runner/hello-react/*
cp -r build/* /home/gitlab-runner/hello-react/

echo "Running server in the background"
sudo systemctl restart hello-react

echo "HTTP server started."

步骤4:在您的代码存储库中,更新.gitlab-ci.yml

image: node:latest

stages:
    - build
    - test
    - deploy

cache:
    paths:
        - node_modules/

install_dependecies:
    stage: build
    script:
        - npm install

    artifacts:
        paths:
            - node_modules/
run_unit_tests:
    stage: test
    script:
        - npm test

deploy_app:
    stage: deploy
    script:
        - bash -c './deploy.sh'

就是这样。 CI / CD作业将完成而不会停止。该应用将被部署,您可以在http://your-server-ip:3000

进行访问