如何在GitLab Runner后台运行vite preview并结束流水线?
解决GitLab流水线因vite preview进程无法结束的问题
核心问题原因
直接在命令后加&没用的根源是:GitLab Runner会跟踪当前shell启动的所有子进程,哪怕进程后台运行,只要还属于当前shell的子进程组,Runner就会一直等待进程结束才会终止流水线。必须让vite preview完全脱离当前shell的控制。
具体解决方案
方案1:修改npm脚本,用nohup+输出重定向+后台运行
把你的npm run serve对应的脚本改成:
./node_modules/.bin/tsc && vite build && nohup ./node_modules/.bin/vite preview --host 0.0.0.0 --port 4173 > /dev/null 2>&1 &
nohup:让进程脱离当前会话,即使启动它的shell退出,进程也能继续运行> /dev/null 2>&1:把标准输出和错误输出都定向到/dev/null,避免生成nohup.out文件,同时防止输出阻塞&:将进程放到后台运行
方案2:用disown移除进程的作业关联
如果不想用nohup,可以在后台启动后加上disown命令,把进程从当前shell的作业列表中移除,让Runner不再跟踪它:
./node_modules/.bin/tsc && vite build && ./node_modules/.bin/vite preview --host 0.0.0.0 --port 4173 > /dev/null 2>&1 & disown
方案3:直接在GitLab CI配置中拆分命令
如果不想修改package.json,也可以在.gitlab-ci.yml的preview阶段直接写命令:
preview: stage: preview script: - npm install - ./node_modules/.bin/tsc - vite build - nohup ./node_modules/.bin/vite preview --host 0.0.0.0 --port 4173 > /dev/null 2>&1 &
验证方式
修改后重新触发流水线,你会发现preview阶段执行完成后,流水线会正常结束,同时vite preview服务保持运行。
内容的提问来源于stack exchange,提问作者Фёдор
相关产品推荐
相关产品推荐

