我有一个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运行后台任务的经验吗?
答案 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应用。
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
sudo
的权限授予用户gitlab-runner
,而没有密码限制。$ sudo usermod -a -G sudo gitlab-runner
$ sudo visudo
现在将以下行添加到文件底部
gitlab-runner ALL=(ALL) NOPASSWD: ALL
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."
.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
进行访问