宝塔面板+Docker+Jenkins自动化部署Vue项目实战指南(手把手教学)

📅 发布时间:2026/7/3 11:46:00 👁️ 浏览次数:
宝塔面板+Docker+Jenkins自动化部署Vue项目实战指南(手把手教学)
1. 环境准备从零搭建你的自动化部署“流水线”咱们今天要聊的这个组合宝塔面板、Docker和Jenkins可以说是前端自动化部署的“黄金搭档”。我刚开始接触这套方案的时候也走过不少弯路比如环境冲突、权限问题、构建失败等等但一旦跑通那种“一键部署”的畅快感真的能让你从重复的体力劳动中彻底解放出来。这个方案特别适合中小型团队或者个人开发者你不需要是运维专家只要跟着步骤一步步来就能搭建起一套稳定、高效的自动化发布流程。简单来说这套流程就像一条智能化的工厂流水线。宝塔面板是你的可视化控制中心负责管理服务器的基础环境和安全Docker是标准化的“集装箱”把Jenkins和你的项目运行环境打包好确保在任何地方运行效果都一样而Jenkins就是这条流水线的“大脑”和“机械臂”自动执行从拉取代码、安装依赖、打包构建到上传部署的全套动作。我们最终要实现的效果是你在本地开发完Vue项目只需要轻轻点一下“构建”按钮或者向Git仓库推送代码几分钟后最新的版本就已经自动更新到线上服务器了。在开始动手之前你需要准备好几样东西。首先是一台云服务器配置不用太高1核2G就足够跑起这套流程操作系统推荐CentOS 7.x或者Ubuntu 20.04 LTS这些都是经过大量实践验证比较稳定的版本。其次你需要一个已经开发完成的Vue项目并且代码托管在Git仓库里比如Gitee或者GitHub。最后也是最重要的你需要有一颗不怕折腾、乐于解决问题的心。部署过程中可能会遇到各种小问题但每一个坑踩过去都是宝贵的经验。接下来我们就从最基础的服务器环境配置开始。1.1 服务器基础配置与宝塔面板安装拿到一台全新的云服务器第一步不是急着装软件而是做好基础配置。我习惯先使用SSH工具比如FinalShell或Xshell连接到服务器然后更新系统软件包。对于CentOS系统可以运行yum update -y对于Ubuntu则是apt update apt upgrade -y。这个操作能确保系统组件是最新的减少后续安装软件时可能出现的依赖冲突。更新完成后我们就来安装本次实战的核心工具之一——宝塔面板。宝塔最大的好处就是可视化把很多复杂的Linux命令变成了鼠标点击对新手极其友好。安装命令非常简单在SSH终端里执行下面这一行以CentOS为例yum install -y wget wget -O install.sh http://download.bt.cn/install/install_6.0.sh sh install.sh执行过程中它会提示你确认安装输入y然后回车。安装过程大概需要2到5分钟取决于你的网络速度。安装成功后终端会显示宝塔面板的访问地址、用户名和随机生成的密码务必立刻把这些信息复制保存到本地这是你进入面板的唯一凭证。接下来你需要在云服务器的安全组或防火墙里放行宝塔面板默认的8888端口以及后续Jenkins会用到的8080端口。放行后在浏览器输入面板地址例如http://你的服务器IP:8888用刚才保存的账号密码登录。首次登录宝塔会推荐你安装一套LNMP或LAMP环境这里我们暂时先跳过因为我们主要使用Docker环境只需要确保服务器基础功能正常即可。进入面板后我建议你先在“面板设置”里修改默认的端口、用户名和密码并绑定自己的宝塔账号这样安全性会高很多。1.2 Docker与Docker Compose的安装与配置有了宝塔这个“控制台”安装Docker就变得异常简单。我们不需要去记复杂的命令行参数。进入宝塔面板的“软件商店”在搜索框里输入“Docker”你会找到“Docker管理器”这个应用点击右侧的“安装”按钮。宝塔会自动处理所有依赖和安装过程通常一两分钟就能完成。安装成功后你可以在“软件商店”的“已安装”列表里找到Docker管理器点击设置图标进入管理界面。这里你可以看到Docker的运行状态、版本信息并能进行简单的容器和镜像管理。不过为了后续操作更灵活我强烈建议你同时打开服务器的SSH终端验证一下Docker是否安装成功。在终端输入docker --version和docker-compose --version如果能看到版本号说明安装无误。为了让Docker运行得更顺畅还需要进行一些优化配置。首先是权限问题默认情况下执行Docker命令需要sudo权限这很麻烦。我们可以将当前用户加入docker用户组来避免每次都输sudosudo usermod -aG docker $USER执行后你需要退出当前SSH会话并重新登录这个配置才会生效。重新登录后运行docker ps命令如果不报错说明配置成功了。另一个重要的优化是配置Docker镜像加速器。由于默认的Docker Hub镜像库在国外拉取镜像速度可能很慢。我们可以修改Docker的守护进程配置文件。在宝塔面板里你可以通过文件管理器找到/etc/docker/daemon.json这个文件如果没有就新建一个在里面写入以下内容这里使用的是阿里云镜像加速地址你需要去阿里云容器镜像服务控制台获取专属加速器地址替换{ registry-mirrors: [https://你的专属加速器地址.mirror.aliyuncs.com] }保存文件后回到SSH终端执行sudo systemctl restart docker重启Docker服务让配置生效。做完这些我们的Docker环境就准备就绪了可以开始部署Jenkins了。2. 部署与初始化Jenkins打造自动化核心Jenkins是整个自动化流程的指挥中枢我们用Docker来运行它可以做到环境隔离和便捷迁移。很多教程会直接docker run启动但我更推荐使用docker-compose来管理因为通过一个清晰的YAML文件来定义服务比一长串命令参数更易于维护和版本控制。我们先在服务器上找一个合适的位置比如/home/docker目录然后创建我们的编排文件。2.1 使用Docker Compose一键启动Jenkins在SSH终端里我们依次执行以下命令来创建目录和配置文件mkdir -p /home/docker/jenkins cd /home/docker/jenkins vim docker-compose.yml如果你不熟悉vim也可以用宝塔面板的文件管理器在这个路径下新建一个名为docker-compose.yml的文件。文件内容如下version: 3.8 services: jenkins: image: jenkins/jenkins:lts-jdk11 container_name: jenkins user: root restart: unless-stopped ports: - 8080:8080 - 50000:50000 volumes: - ./jenkins_home:/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock - /usr/bin/docker:/usr/bin/docker environment: - TZAsia/Shanghai我来解释一下这个配置文件的关键点。image指定了我们使用的镜像lts-jdk11是长期支持版并基于JDK11比较稳定。user: root是为了让容器内的Jenkins有足够权限去执行Docker命令例如在构建时运行其他容器这是实现“Docker in Docker”或调用宿主机Docker的关键。ports映射了两个端口8080是Web管理界面50000是Jenkins的代理通信端口可能用于分布式构建。volumes挂载了三个卷这是重中之重。第一个./jenkins_home:/var/jenkins_home将容器内的Jenkins数据目录挂载到宿主机的当前目录下这样即使容器销毁你的所有任务、配置、插件数据都不会丢失。第二个和第三个挂载/var/run/docker.sock和/usr/bin/docker是将宿主机的Docker守护进程和客户端命令映射到容器内这样Jenkins容器就能直接使用宿主机的Docker环境来构建和运行其他容器了非常巧妙。environment里设置了时区避免任务执行时间显示混乱。配置文件保存后在docker-compose.yml的同级目录下执行启动命令docker-compose up -d-d参数代表后台运行。执行成功后用docker-compose ps命令可以看到名为jenkins的容器正在运行。现在打开浏览器访问http://你的服务器IP:8080就能看到Jenkins的初始化界面了。2.2 解锁Jenkins并完成基础配置第一次访问Jenkins它会要求你输入一个管理员初始密码。这个密码在哪里呢就在我们刚才挂载的jenkins_home目录里。在SSH终端中可以运行以下命令查看注意容器刚启动时生成这个文件可能需要十几秒如果找不到可以稍等再试cat /home/docker/jenkins/jenkins_home/secrets/initialAdminPassword把终端显示的一长串密码复制下来粘贴到Jenkins网页的输入框中点击“继续”。接下来它会让你选择安装插件的方式。这里我建议不要直接安装推荐插件。因为网络环境的原因安装大量推荐插件很容易失败导致卡在这个界面很久。我们选择“选择插件来安装”然后直接点击右下角的“无”先安装一个“空”的Jenkins。跳过插件安装后系统会引导你创建第一个管理员用户。这里一定要认真填写用户名、密码和邮箱并务必记牢这是你以后登录和管理Jenkins的凭证。点击“保存并完成”然后“开始使用Jenkins”你就进入了Jenkins的主仪表盘。一个纯净的Jenkins已经就绪接下来我们按需安装必要的插件。进入Jenkins主界面点击左侧菜单的“Manage Jenkins”管理Jenkins然后选择“Manage Plugins”管理插件。切换到“Available”可选插件标签页。在右上角的过滤框里搜索并勾选以下我们核心流程必需的插件NodeJS Plugin 用于在构建环境中安装和指定Node.js版本这是构建Vue项目的基础。Publish Over SSH 这是将构建好的文件推送到远程服务器也就是本机或另一台服务器的关键插件。Git Parameter Plug-in 这个插件非常实用它可以让你在构建时选择Git仓库的特定分支或标签实现按需部署。勾选后点击页面底部的“Install without restart”不重启安装。安装过程可能会持续几分钟页面会显示进度。如果有个别插件安装失败通常是由于网络超时可以多试几次或者更换插件下载镜像源。所有插件安装成功后建议点击“Restart Jenkins when installation is complete and no jobs are running”当安装完成且没有任务运行时重启Jenkins的复选框让Jenkins重启以加载新插件。3. Jenkins全局配置连接你的代码与服务器插件安装好后我们需要告诉Jenkins一些全局信息比如你的Node.js版本从哪里来如何连接到你的服务器进行文件传输。这些配置一次做好以后创建任务时就可以直接调用非常方便。3.1 配置Node.js环境与全局工具Vue项目构建离不开Node.js和npm。我们不可能每次构建都去服务器上手动安装Jenkins的NodeJS插件就是为了解决这个问题。再次进入“Manage Jenkins”这次选择“Global Tool Configuration”全局工具配置。页面往下拉找到“NodeJS”配置区域。点击“NodeJS installations...”旁边的“Add NodeJS”按钮。给它起个名字比如 “NodeJS-16”。重点来了一定要勾选“Install automatically”自动安装选项。然后在版本下拉框里选择一个稳定的LTS版本比如 “NodeJS 16.x.x”。我实测下来对于大多数Vue 2和Vue 3项目16.x版本兼容性最好不太容易出幺蛾子。至于18.x或更高版本虽然新但有时会遇到原生模块编译问题新手可以先避开。你可以指定一个全局的npm包镜像源来加速依赖安装。在“Global npm packages to install”里可以添加cnpm或者配置npm的registry。我个人的习惯是直接在构建脚本里指定镜像源这样更灵活。配置好后点击页面最下方的“Save”保存。这样Jenkins在构建时就会自动下载并安装指定版本的Node.js到它的工作空间。3.2 配置SSH服务器连接Publish Over SSH接下来配置如何把打包好的文件发送到Web服务器。我们使用宝塔面板管理网站所以Web目录通常是/www/wwwroot/你的站点名。我们需要让Jenkins能通过SSH连接到它自己所在的这台服务器本地连接。进入“Manage Jenkins” - “Configure System”系统配置。页面往下拉找到“Publish over SSH”区域。如果没找到说明Publish Over SSH插件没装成功需要回去检查。首先需要配置SSH的密钥。点击“高级”按钮展开更多选项。这里有两种方式一种是使用密码在“Passphrase”和“Path to key”留空然后在下面的“SSH Servers”里直接填密码另一种更安全的是使用密钥对。我推荐用密钥对方式。在服务器上生成SSH密钥对如果已有可跳过ssh-keygen -t rsa -b 4096 -C jenkinsyourserver一路回车会在~/.ssh/目录下生成id_rsa私钥和id_rsa.pub公钥。将公钥添加到授权列表cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys设置正确的权限非常重要权限不对会导致连接失败chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys ~/.ssh/id_rsa在Jenkins配置中加载私钥 回到Jenkins网页配置界面在“Publish over SSH”的“高级”选项下点击“Add”添加一个密钥。选择“Enter directly”将服务器上~/.ssh/id_rsa文件的内容可以用cat ~/.ssh/id_rsa命令查看整个复制粘贴到“Key”文本框里。然后在下面的“SSH Servers”部分点击“Add”添加一个服务器。Name 起个名字比如 “My_BT_Server”。Hostname 填写服务器的IP地址如果是本机可以填127.0.0.1或服务器内网IP。Username 填写你用来登录服务器的用户名通常是root。Remote Directory 填写远程服务器的基准目录。这里我强烈建议填写一个绝对路径比如/www/wwwroot。这样在后续任务配置中传输文件的路径就是基于这个目录的。配置完成后一定要点击右下角的“Test Configuration”按钮进行测试。如果看到绿色的“Success”提示说明SSH连接配置成功了。最后滚动到页面底部点击“Save”保存所有系统配置。4. 创建并配置Jenkins任务实现Vue项目自动构建万事俱备只欠东风。现在我们来创建一个真正的Jenkins任务Job把前面所有的配置串联起来实现从代码到上线的全自动化。4.1 新建任务与源码管理配置在Jenkins主面板点击“新建Item”新建任务。输入一个任务名称例如 “vue-project-auto-deploy”选择“构建一个自由风格的软件项目”然后点击“OK”。进入任务配置页面后我们先勾选“参数化构建过程”。这是我们之前安装的Git Parameter插件发挥作用的地方。点击“添加参数”选择“Git Parameter”。在名称里填一个变量名比如BRANCH_TAG。参数类型可以选择“分支或标签”这样构建时我们就可以下拉选择。默认值可以填你的主分支比如main或master。这个功能在需要上线特定功能分支或回滚到某个标签版本时特别有用。接下来找到“源码管理”部分选择“Git”。在“Repository URL”里填入你的Vue项目Git仓库地址可以是HTTPS或SSH格式。如果你配置了Git凭证在“Manage Jenkins” - “Manage Credentials”里可以添加就在这里选择对应的凭证。否则对于公开仓库可以留空私有仓库则需要填写用户名密码或SSH密钥。关键一步来了在“Branches to build”的“Branch Specifier”里将默认的*/master修改为*/${BRANCH_TAG}。这里的${BRANCH_TAG}就是我们上一步定义的参数变量。这样Jenkins在构建时就会去拉取我们选择的那个分支或标签的代码。4.2 编写构建脚本与部署后操作源码配置好后我们来到最核心的“构建”部分。点击“增加构建步骤”选择“Execute shell”执行shell。这个脚本将在Jenkins的工作空间一个临时目录里面拉取了你的代码里执行完成构建工作。一个完整的、健壮的构建脚本示例#!/bin/bash # 打印环境信息 echo 开始构建构建分支/标签$BRANCH_TAG node -v npm -v # 配置npm镜像源并安装依赖使用淘宝镜像加速 npm config set registry https://registry.npmmirror.com/ echo 开始安装项目依赖... npm install --legacy-peer-deps if [ $? -ne 0 ]; then echo 依赖安装失败构建终止 exit 1 fi # 执行构建 echo 开始构建生产包... npm run build if [ $? -ne 0 ]; then echo 项目构建失败构建终止 exit 1 fi echo 构建成功构建产物位于 dist/ 目录下。 # 进入构建产物目录准备打包传输 cd dist # 为压缩包生成一个带时间戳的唯一名称避免覆盖 PROJECT_NAMEvue-project-$(date %Y%m%d%H%M%S).tar.gz # 打包当前目录下所有文件 tar -zcvf $PROJECT_NAME * echo 打包完成$PROJECT_NAME # 回到上层目录将压缩包移动到工作空间根目录方便后续SSH插件查找 cd .. mv dist/$PROJECT_NAME ./这个脚本做了几件事1. 设置npm镜像加速2. 安装依赖--legacy-peer-deps参数可以解决一些新版npm的peer依赖冲突3. 执行npm run build4. 将构建产出的dist目录打包成一个带时间戳的压缩包并移动到工作空间根目录。每一步都做了错误检查失败会立即退出。构建完成后我们需要把压缩包发送到Web服务器并解压。点击“增加构建后操作步骤”选择“Send build artifacts over SSH”。在“SSH Server”里选择我们之前配置好的“My_BT_Server”。Transfer Set Source files 这里填写构建生成的压缩包由于我们把它移到了工作空间根目录所以填*.tar.gz。这个通配符会匹配上我们刚生成的带时间戳的压缩包。Remove prefix 留空。Remote directory 这里填写相对于系统配置里“Remote Directory”的子路径。假设你的网站根目录是/www/wwwroot/vue-app而系统配置里“Remote Directory”是/www/wwwroot那么这里就填vue-app。最终文件会被传输到/www/wwwroot/vue-app下。Exec command 文件传输完成后在远程服务器上执行的命令。这里我们写一个部署脚本# 进入网站目录 cd /www/wwwroot/vue-app # 备份当前线上文件可选但非常推荐 if [ -d dist_bak ]; then rm -rf dist_bak fi if [ -d dist ]; then mv dist dist_bak_$(date %Y%m%d%H%M%S) fi # 解压新上传的压缩包 tar -zxvf *.tar.gz # 删除压缩包 rm -rf *.tar.gz # 这里可以根据需要重启Nginx或PM2进程 # systemctl reload nginx echo 部署成功 这个远程命令实现了“备份旧版本 - 解压新版本 - 清理压缩包”的流程是一种比较安全的部署方式。全部配置完成后点击页面底部的“保存”。5. 测试与优化让你的流水线更稳定高效点击保存后我们就回到了任务的主页面。现在点击左侧的“Build with Parameters”使用参数构建你会看到一个下拉框里面是你Git仓库的所有分支和标签。选择一个比如main分支然后点击“开始构建”。5.1 首次构建与问题排查第一次构建通常会花费较长时间因为Jenkins需要下载Node.js环境如果你配置了自动安装和项目的所有npm依赖。你可以点击构建队列里正在运行的任务进入“控制台输出”查看实时日志。这是排查问题的关键窗口。常见的几个坑和解决办法Node.js安装失败或速度慢 检查Jenkins全局工具配置中Node.js的安装源可以尝试更换为国内镜像。也可以在构建脚本里直接使用宿主机已安装的Node.js通过配置Jenkins的“环境变量”实现。npm install 失败 网络问题是主因。确保构建脚本中的镜像源地址正确可用。对于私有仓库或有特殊依赖的项目可能需要先在Jenkins中配置npm的认证信息。SSH传输失败 检查Publish Over SSH配置中的私钥内容是否正确不能有多余的空格或换行以及远程目录的权限。确保Jenkins容器内的用户我们之前配置的root有权限写入目标目录/www/wwwroot/vue-app。构建成功但页面没更新 检查远程命令的执行路径是否正确解压后的文件是否覆盖了正确的目录。同时检查宝塔面板中网站设置的“根目录”是否指向了/www/wwwroot/vue-app/dist假设你的Vue项目构建后直接生成在dist目录下。当控制台输出最后出现“SUCCESS”的绿色标志并且远程命令回显了“部署成功”恭喜你整个自动化流水线已经打通了你可以立即访问你的网站看看是否已经更新为最新构建的版本。5.2 进阶优化与最佳实践基础流程跑通后我们可以做一些优化让这个流水线更专业、更强大。首先配置Webhook实现自动触发。现在每次构建还需要手动点击我们可以让Git平台在代码推送时自动通知Jenkins。在Jenkins任务配置的“构建触发器”中勾选“GitHub hook trigger for GITScm polling”或“触发远程构建”。然后在你的Gitee或GitHub仓库设置里添加一个WebhookPayload URL填写http://你的Jenkins地址:8080/github-webhook/或.../gitee-webhook/具体路径取决于插件这样每次你推送代码到对应分支Jenkins就会自动开始构建部署。其次优化构建速度和清洁度。可以在Jenkins任务配置中勾选“丢弃旧的构建”设置保留构建的天数和最大个数避免工作空间被历史构建数据占满。对于node_modules这种巨大的依赖目录可以利用Jenkins的缓存机制或者使用npm ci命令替代npm install它能提供更快速、更一致的依赖安装。再者增加构建状态通知。可以在“构建后操作”中添加“Editable Email Notification”等插件配置在构建成功或失败时发送邮件通知到你的团队让大家及时知晓部署状态。最后也是最重要的安全考虑。确保Jenkins的管理员密码强度足够并定期更换。限制能访问Jenkins服务的IP地址可以通过宝塔面板的防火墙设置。妥善保管SSH私钥使用密钥对而非密码连接。对于生产环境的部署可以考虑使用更复杂的“发布审批”流程例如结合“Role-based Authorization Strategy”插件实现开发人员可以构建测试环境但只有运维人员才能手动触发生产环境部署。踩过几次坑之后我发现自动化部署最大的价值不仅仅是节省时间更是保证了部署过程的一致性避免了“在我电脑上是好的”这类问题。把繁琐的重复操作交给机器开发者就能更专注于代码逻辑和业务创新。现在当你看到每次代码推送后网站都能自动更新那种成就感和效率的提升会让你觉得前面所有的折腾都是值得的。