如何通过Jenkins将Node.js应用部署至远程主机?
如何在Jenkins中部署独立的Node.js项目到远程服务器?
看起来你已经搞定了Jenkins拉取GitLab代码的环节,接下来要解决的就是跨服务器部署的核心问题——毕竟Jenkins、Node服务器、GitLab是完全独立的,关键是让Jenkins能安全地远程操作Node服务器,下面一步步来:
第一步:先搞定Jenkins与Node服务器的SSH免密登录
要让Jenkins能远程执行命令、传输文件,首先得让Jenkins服务器能免密登录到Node服务器,这样部署时不用手动输密码:
- 登录到Jenkins服务器,切换到Jenkins运行用户(一般是
jenkins用户),执行ssh-keygen -t rsa -b 4096,一路按回车用默认配置即可,这会在~/.ssh目录下生成id_rsa(私钥)和id_rsa.pub(公钥) - 把
id_rsa.pub里的内容复制出来,登录到Node服务器,找到你要部署的用户的~/.ssh/authorized_keys文件(如果没有就新建一个),把公钥内容粘贴进去,保存后记得设置权限:chmod 600 ~/.ssh/authorized_keys、chmod 700 ~/.ssh - 测试连接:在Jenkins服务器上执行
ssh 你的Node服务器用户名@Node服务器IP,如果能直接登录,说明免密配置成功
第二步:修改Jenkinsfile,完善部署流程
你原来的Jenkinsfile只有简单的scp命令,我们需要扩展成完整的部署流程,包括传代码、装依赖、启动服务。这里给你一个实用的示例,你可以根据项目调整:
pipeline { agent any triggers { pollSCM('* * * * *') // 每分钟轮询GitLab,有代码变更就触发部署 } // 定义环境变量,后续修改更方便 environment { NODE_SERVER_IP = '你的Node服务器IP地址' NODE_SERVER_USER = 'Node服务器上的操作用户名' DEPLOY_DIR = '/opt/my-node-app' // 远程服务器的项目部署目录 } stages { stage('拉取最新代码') { steps { checkout scm // Jenkins自动拉取GitLab代码,显式写出更清晰 } } stage('同步代码到Node服务器') { steps { sh """ # 先在远程服务器创建部署目录(不存在则新建) ssh ${NODE_SERVER_USER}@${NODE_SERVER_IP} "mkdir -p ${DEPLOY_DIR}" # 同步Jenkins工作区代码到远程,排除.git、node_modules等无用文件 scp -r ./* ${NODE_SERVER_USER}@${NODE_SERVER_IP}:${DEPLOY_DIR}/ """ } } stage('远程安装依赖并启动服务') { steps { sh """ ssh ${NODE_SERVER_USER}@${NODE_SERVER_IP} " cd ${DEPLOY_DIR} # 安装生产环境依赖,跳过开发依赖提升速度 npm install --production # 用pm2管理Node进程(崩溃自动重启,比直接node app.js更稳定) # 先检查pm2是否安装,未安装则全局安装 if ! command -v pm2 &> /dev/null; then npm install -g pm2 fi # 重启应用,首次启动则直接启动 pm2 restart app.js || pm2 start app.js --name 'my-node-service' # 保存pm2进程列表,确保服务器重启后自动启动应用 pm2 save pm2 startup " """ } } } // 部署完成后的状态提示 post { success { echo '✅ Node项目部署成功!' } failure { echo '❌ 部署失败,请查看Jenkins日志排查问题!' } } }
一些实用细节提醒
- 如果是前端项目(如React/Vue),需要先构建再部署:可以在Jenkins本地先执行
npm install && npm run build,再把dist目录同步到远程服务器的静态文件目录 - 若Node服务器有防火墙,需确保Jenkins服务器IP能访问Node服务器的22端口(SSH),以及Node应用对外暴露的端口
- 不想用pm2的话,也可以用systemd管理Node进程:把启动命令写成systemd服务脚本,在Jenkins里执行
systemctl restart your-service-name即可 - 觉得原生ssh/scp繁琐的话,可安装Jenkins的SSH插件,用
sshCommand、sshPut等步骤简化操作,不过原生命令无需额外插件,兼容性更好
内容的提问来源于stack exchange,提问作者ace
相关产品推荐
相关产品推荐

