You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 20:55:07