当前位置: 首页 > news >正文

手把手教你用Docker+Jenkins搭建前端自动化部署流水线

之前一直用 FTP 手动拖前端包到服务器,拖了几次实在忍不了——又慢又容易手滑覆盖错目录。后来用 Docker + Jenkins 搭了个自动化流水线,代码一推送,构建、打包、部署全自动跑完,几分钟搞定。踩了一些坑,记录一下顺带帮大家避坑。

环境很简单,一台有 Docker 的服务器就行。Jenkins 也用 Docker 起,这样最干净。启动命令长这样,关键是得把宿主机的 docker.sock 挂进容器,让 Jenkins 能操作宿主的 Docker:

docker run -d \--name jenkins \-p 8080:8080 -p 50000:50000 \-v jenkins_home:/var/jenkins_home \-v /var/run/docker.sock:/var/run/docker.sock \jenkins/jenkins:lts

跑起来之后 docker logs 捞一下初始密码,浏览器 ip:8080 进去装推荐插件,再手动把 NodeJS、Docker Pipeline 之类的装上。如果插件下载慢,建议上代理,不然等得心态爆炸。

重点是写 Pipeline,我们用 Jenkinsfile 把整个流程串起来。在项目根目录新建一个 Jenkinsfile,内容我先贴出来,再做说明:

pipeline {agent anyenvironment {// 镜像名,可以直接用项目名IMAGE_NAME = 'my-frontend-app'// 宿主机上部署的端口映射HOST_PORT = '8888'}stages {stage('Checkout') {steps {// 拉取代码,根据你的git配置调整git branch: 'main', url: 'https://github.com/yourname/your-repo.git'}}stage('Build Frontend') {steps {// 在node容器里构建前端script {docker.image('node:16-alpine').inside {sh 'npm install'sh 'npm run build'}}}}stage('Build Docker Image') {steps {script {// 用项目里的 Dockerfile 打镜像def appImage = docker.build("${IMAGE_NAME}:${env.BUILD_ID}")// 也可以顺手 push 到私有仓库,这里先不打 tag 推}}}stage('Deploy') {steps {script {// 停掉旧容器,启动新容器,端口映射用 Nginx 把 dist 包暴露出去sh """docker rm -f ${IMAGE_NAME} || truedocker run -d \--name ${IMAGE_NAME} \-p ${HOST_PORT}:80 \${IMAGE_NAME}:${env.BUILD_ID}"""}}}}
}

关键点拆开说:

  • Checkout:直接拉分支,你如果是私有仓库可能得先配好凭据,这一步不赘述。
  • Build Frontend:用了 docker.image('node:16-alpine').inside,意思是临时起一个 node 容器,把当前工作目录挂进去运行 npm 命令。这样宿主机不用装 Node 环境,保证构建环境一致性,也不会污染宿主机。构建完 dist 目录留在 workspace 里。
  • Build Docker Image:下面要有个 Dockerfile,内容很简单,把 dist 塞进 nginx 镜像就成了。docker.build 自动用当前目录的 Dockerfile 构建,镜像名带上 BUILD_ID 方便区分版本。
  • Deploy:直接粗暴地停旧容器然后启动新的。生产环境你可能用 docker-compose 或者更优雅的滚动更新,但个人/小项目这样够用了,停机时间也就一两秒。

Dockerfile 长这样,放在项目根目录:

FROM nginx:alpine
# 把构建好的静态文件复制到 nginx 的 html 目录
COPY dist /usr/share/nginx/html
# 如果你有自定义 nginx 配置,可以挂进去,这里不赘述
EXPOSE 80

关于部署这步,其实直接 docker run 已经能跑,但你可能会想加一个 nginx 配置来处理前端路由 history 模式,或者做反向代理。这种需求可以写个 default.conf 然后在 Dockerfile 里 COPY 进去,或者用 docker-compose 管理配置更灵活。简单版就用上面的 run 命令。

如果项目里已经用了 docker-compose,可以把 deploy stage 改成:

stage('Deploy with Compose') {steps {script {sh '''export IMAGE_TAG=${BUILD_ID}docker-compose down || truedocker-compose up -d'''}}
}

对应的 docker-compose.yml 里镜像标签用变量 ${IMAGE_TAG} 就行。这样回滚也方便,改一下环境变量就切回去了。

整个流水线跑通之后,你每次往 main 分支推代码,Jenkins 自动拉代码、npm 构建、打 Docker 镜像、部署一气呵成。如果怕构建产物把 Jenkins 磁盘撑爆,可以在 pipeline 最后加个清理步骤,把工作区的 node_modules 和中间镜像清理掉。

我前后折腾了两小时搞定,其中一小时在等插件下载…… 搭好之后幸福感提升巨大,再也没手动部署过。现在就算半夜改完代码,打开 Jenkins 界面点一下“立即构建”,安心睡觉,醒来就是新版。

这套方案拓展性也不错,比如加上 stage('Test') 跑单元测试,或者推送镜像到私有仓库再到目标服务器部署。总之基础架子搭好,后面慢慢加料就行。希望这篇能帮你少走点弯路。

http://www.zskr.cn/news/1482085.html

相关文章:

  • 汽车电子潜在路径分析:从航天技术到工程实践的防漏电设计
  • P1081 [NOIP 2012 提高组] 开车旅行
  • 如何用Python在3分钟内构建企业级抖音批量下载解决方案
  • 成都旧房翻新价格多少?2026年报价明细+避坑指南+公司对比 - 优家闲谈
  • 别再瞎找AI写论文工具!6款全学科神器,一键极速搞定毕业论文 - 麟书学长
  • 020、配置调试与故障诊断:claude config 诊断命令与 10 个常见错误的修复方案
  • Pearcleaner终极指南:免费开源macOS深度清理工具,彻底告别应用残留
  • C51单片机XBYTE宏详解:外部总线访问与内存映射I/O实战
  • 抖音批量下载工具完全指南:5分钟掌握无水印视频下载技巧
  • 嵌入式触摸屏数字键盘实现:图片映射与区域检测方案详解
  • 抖音批量下载终极指南:5分钟免费获取无水印视频素材
  • 2026回本实测解密:68%商家AI直播闲置亏损!
  • 压敏电阻选型与应用指南:从原理到电路保护设计
  • Chrome浏览器密码输入行为捕获工具:专为授权安全测试设计的轻量级扩展
  • 营业执照OCR识别接口接入实践:文档解析、请求校验与工程化落地指南
  • 杭州阿里总部周边5家广式鸡煲店实测排行 - 奔跑123
  • 手把手写你的第一个 Skill:5 分钟搞定
  • Packmol分子动力学模拟初始构型构建完全指南:从入门到精通
  • D类功放原理与实战:从PWM调制到PCB布局全解析
  • 3分钟掌握Whisky:在Mac上运行Windows程序的终极方案
  • 51单片机入门:从环境搭建到点亮LED的嵌入式开发实战指南
  • 千元迷你主机选购指南:英特尔N150芯片解析与三款热门机型横评
  • 终极指南:用Python快速获取同花顺问财数据的完整教程
  • Fillinger智能填充插件:Illustrator设计效率提升18倍的终极指南
  • Kubernetes HPA 自动扩缩容实战:从基础 CPU 指标到自定义指标的全链路调优
  • 音乐格式转换终极指南:Unlock Music高效解锁加密音频文件解决方案
  • 如何在Windows上轻松管理MIFARE Classic智能卡?MifareOneTool的完整解决方案
  • 基于 Simulink 的轨道车辆牵引电机直接转矩控制(DTC)及其磁链观测器仿真实战教程
  • 硬件电路设计中的电容精度计算与最坏情况分析实践
  • Nios II uClinux系统构建实战:从环境搭建到内核启动