如何使用Jenkins为MERN栈应用搭建无镜像仓库的CI/CD流水线
无镜像仓库的MERN栈Jenkins CI/CD流水线实现方案
核心思路是绕过公共/私有镜像仓库,通过Docker镜像导出-传输-导入的链路,结合SSH远程操作完成从Jenkins构建到独立服务器部署的全流程。以下是具体实现步骤:
前置准备
- Jenkins服务器与部署服务器均安装Docker,且将执行流水线的用户(如
jenkins、部署服务器的操作用户)加入docker组:sudo usermod -aG docker 用户名 sudo systemctl restart jenkins # Jenkins服务器需重启生效 - 配置Jenkins服务器到部署服务器的SSH免密登录:在Jenkins服务器生成SSH密钥,将公钥添加至部署服务器的
~/.ssh/authorized_keys文件中 - 确保MERN项目已编写好符合需求的Dockerfile(推荐用多阶段构建减小镜像体积)
Jenkins流水线核心步骤
以下是基于Groovy的流水线示例,可直接在Jenkinsfile中使用:
1. 拉取项目代码
stage('拉取代码') { steps { git url: '你的MERN项目Git仓库地址', branch: 'main' } }
2. 在Jenkins服务器构建Docker镜像
stage('构建Docker镜像') { steps { script { // 用Git Commit ID作为镜像标签,避免版本冲突 def commitId = sh(script: 'git rev-parse --short HEAD', returnStdout: true).trim() sh "docker build -t mern-app:${commitId} ." // 同时打latest标签方便后续操作 sh "docker tag mern-app:${commitId} mern-app:latest" } } }
3. 导出镜像为压缩文件
stage('导出镜像') { steps { script { sh 'docker save -o mern-app.tar mern-app:latest' // 压缩镜像文件减少传输体积 sh 'gzip mern-app.tar' } } }
4. 传输镜像文件到部署服务器
stage('传输镜像至部署服务器') { steps { script { // 替换为部署服务器的IP、用户名和目标目录 sh 'scp mern-app.tar.gz deploy-user@192.168.1.100:/opt/docker-images/' } } }
5. 远程部署容器
通过SSH在部署服务器完成镜像导入、旧容器清理、新容器启动:
stage('部署到目标服务器') { steps { script { sh ''' ssh deploy-user@192.168.1.100 << EOF cd /opt/docker-images/ # 解压镜像文件 gunzip mern-app.tar.gz # 导入镜像到本地Docker docker load -i mern-app.tar # 停止并删除旧容器(不存在则忽略错误) docker stop mern-container || true docker rm mern-container || true # 启动新容器,替换为你的端口映射和环境变量配置 docker run -d --name mern-container \ -p 80:3000 -p 5000:5000 \ -e MONGO_URI="mongodb://your-mongo-host:27017/mern-db" \ mern-app:latest EOF ''' } } }
6. 清理临时文件
stage('清理临时文件') { steps { script { // 清理Jenkins服务器的镜像压缩包 sh 'rm -f mern-app.tar.gz' // 清理部署服务器的临时文件 sh 'ssh deploy-user@192.168.1.100 "rm -f /opt/docker-images/mern-app.tar"' } } }
可选优化
- 用
rsync替代scp:针对大镜像,rsync可增量传输,减少耗时 - 使用Jenkins Docker SSH插件:替代手动编写SSH/SCP命令,简化远程Docker操作
- 镜像分层优化:在Dockerfile中合理安排指令顺序,利用Docker缓存减少构建时间
- 版本化管理:始终用Git Commit ID或版本号作为镜像标签,避免覆盖问题
内容的提问来源于stack exchange,提问作者Patil
相关产品推荐
相关产品推荐

