
Jenkins 自动化部署 Nuxt 项目完整教程
Nuxt 项目部署是前端工程化中常见的一环,手动部署不仅效率低,还容易出错。本文分享一套基于 Jenkins 的 Nuxt 自动化部署方案,通过 Docker 构建 + rsync 同步的方式,实现一键部署上线。
方案概览
整体流程分为三个阶段:拉取代码 → Docker 构建 → 同步部署到服务器。构建阶段使用 Docker 容器来运行 Node 环境,这样做的好处是不需要在 Jenkins 宿主机上安装 Node.js,构建环境和项目需要的 Node 版本完全解耦,升级也方便。
部署阶段使用 rsync 增量同步到远程服务器,比 scp 全量传输更快,也支持排除不需要的文件。
Jenkins Pipeline 配置
直接上完整的 Jenkinsfile 配置,后面分段讲解:
pipeline {
agent any
environment {
REMOTE_USER = 'root'
REMOTE_HOST = 'xxxx'
REMOTE_PATH = '/data/web/xxx'
}
stages {
stage('Checkout') {
steps {
echo 'Checkout'
echo "${params.BRANCH}"
checkout(
[
$class: 'GitSCM',
branches: [[name: "${params.BRANCH}"]],
userRemoteConfigs: [
[credentialsId: 'xxxx', url: 'xxxxx']
]
]
)
}
}
stage('Build Frontend node') {
steps {
script {
sh """
cp .prod.env .env
docker run --rm \
-u root \
-v ${WORKSPACE}:/workspace \
-w /workspace \
-p 3012:3012 \
-e PORT=3012 \
-e NITRO_PORT=3012 \
node:22-alpine \
/bin/sh -c "
cd /workspace/
npm install --registry=https://registry.npmmirror.com &&
npm run build
"
"""
}
}
}
stage('Finished') {
steps {
script {
sshagent(credentials: ['jenkins-deploy-key']) {
sh """
rsync -avz --delete --force --exclude=".user.ini" \
./.output \
${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}/
echo "Deployment complete."
"""
}
}
}
}
}
}
分段解析
1. 环境变量定义
顶部 environment 区块定义了远程服务器的连接信息,包括用户名、IP 地址和部署路径。统一放在这里方便后续修改,也方便做成参数化构建。
2. Checkout 阶段
使用 GitSCM 插件拉取指定分支的代码,分支名通过参数 ${params.BRANCH} 传入。需要在 Jenkins 项目中配置好 Git 凭证,credentialsId 对应你在 Jenkins 里添加的凭证 ID。
3. Build 阶段
这是整个流水线的核心部分。思路是用 Docker 启动一个 node:22-alpine 容器,把当前工作目录挂载进去,在容器里执行 npm install 和 npm run build。
有几个细节值得注意:
- --rm:构建完成后自动删除容器,不会留下残留容器
- -u root:以 root 用户运行,避免文件权限问题
- -v ${WORKSPACE}:/workspace:把 Jenkins 工作目录挂载到容器内,构建产物直接写到宿主机
- -w /workspace:设置工作目录
- npm install 使用国内镜像源:加速依赖安装
- cp .prod.env .env:把生产环境配置文件复制到位,Nuxt 构建时会读取 .env
4. 部署阶段
构建产物生成在 .output 目录中,使用 sshagent 插件加载 SSH 密钥,然后通过 rsync 同步到远程服务器。
rsync 的几个参数说明:
- -avz:归档模式 + 详细输出 + 压缩传输
- --delete:删除目标目录中源端没有的文件,保持两边一致
- --exclude=".user.ini":排除服务器上的特定文件,避免被覆盖
同步完成后,在远程服务器上用 PM2 或 systemd 重启 Nuxt 服务即可。这一步也可以加到 Pipeline 里,用 ssh 命令远程执行重启。
前置准备
在使用这套流水线之前,需要先做好以下准备工作:
- Jenkins 安装 Docker,并且 Jenkins 用户有权限执行 docker 命令
- 安装 SSH Agent 插件(sshagent)
- 在 Jenkins 凭证中添加 Git 凭证和部署用的 SSH 密钥
- 远程服务器配置好 SSH 密钥登录,并且目标目录存在
- 项目根目录下有 .prod.env 生产环境配置文件
常见问题
Q: 构建很慢怎么办?
可以把 node_modules 缓存起来,下次构建不用重新安装所有依赖。可以使用 Jenkins 的 stash/unstash,或者把 node_modules 挂载到宿主机的缓存目录。
Q: 构建时端口冲突怎么办?
构建阶段其实不需要端口映射,上面的 -p 参数是为了调试方便,实际构建生产环境时可以去掉。
Q: rsync 同步权限报错?
检查远程服务器上目标目录的所有者是否和 SSH 登录用户一致,或者在 rsync 命令里加上合适的权限参数。
总结
用 Docker 构建 + rsync 部署的方案,好处是构建环境干净、升级 Node 版本方便、部署速度快。整个流程配置好之后,点一下构建就可以自动完成从拉代码到部署上线的全部步骤,比手动部署省心很多。
如果项目有多个环境,可以在 Jenkins 里建多个 Job,或者把环境做成参数,一套流水线适配多个环境。