如何在Jenkins上构建并部署可常驻运行的FastAPI Python脚本?
解决Jenkins流水线中FastAPI后台运行的问题
你的核心问题是python api.py以前台方式启动,占用了Jenkins的shell进程,导致构建一直等待进程结束而无法完成。要实现构建成功并让FastAPI持续运行,需要把FastAPI放到后台启动,同时处理进程冲突和日志输出。
修改后的Jenkins流水线脚本
agent any stages { stage('拉取代码') { steps { git url: 'https://gitlab.com/something1234/test.git', branch: 'hello' } } stage('部署FastAPI'){ steps { sh """ # 杀死之前运行的FastAPI进程(避免端口冲突) pkill -f "python api.py" || true # 激活conda环境 . /home/soleman/anaconda3/bin/activate tensor2 conda activate tensor2 # 后台启动FastAPI并持久化日志 nohup python api.py > /var/log/fastapi.log 2>&1 & # 验证进程是否正常启动 sleep 2 if pgrep -f "python api.py"; then echo "FastAPI 启动成功" else echo "FastAPI 启动失败" exit 1 fi """ } } } }
关键修改说明
- 杀死旧进程:
pkill -f "python api.py" || true会匹配所有运行python api.py的进程并杀掉,|| true确保没有旧进程时命令不会报错,避免构建失败。如果FastAPI用固定端口,也可以用端口过滤:lsof -i :8000 | grep LISTEN | awk '{print $2}' | xargs kill -9 || true(替换8000为你的端口)。 - 后台启动:
nohup ... &组合实现两个效果:nohup让进程在Jenkins shell退出后继续运行,&让进程后台执行,不占用当前shell。 - 日志重定向:
> /var/log/fastapi.log 2>&1把标准输出和错误输出都写入日志文件,既避免Jenkins捕获输出导致阻塞,也方便后续排查问题。 - 启动验证:
sleep 2等待进程启动,pgrep检查进程是否存在,确保部署成功才结束构建。
注意事项
- 确保Jenkins用户有杀死进程和写入日志目录的权限(比如
/var/log需要适当权限,或者把日志放到代码目录里)。 - 如果你的FastAPI启动命令需要指定端口或其他参数,直接加到
python api.py后面即可(比如python api.py --port 8080)。 - 若conda环境激活失败,检查Jenkins用户是否能访问
/home/soleman/anaconda3目录,必要时修改目录权限。
内容的提问来源于stack exchange,提问作者Salman
相关产品推荐
相关产品推荐

