实战指南:基于 Docker+Jenkins+Gitee 构建企业级前端自动化部署流水线

张开发
2026/4/9 3:28:10 15 分钟阅读

分享文章

实战指南:基于 Docker+Jenkins+Gitee 构建企业级前端自动化部署流水线
1. 为什么需要自动化部署流水线每次手动部署前端项目时你是不是也经历过这样的痛苦先本地跑build然后打开FTP工具找到服务器目录小心翼翼地覆盖文件最后还要手动刷新CDN缓存。更可怕的是有时候会忘记上传某个文件或者不小心覆盖了别人的修改。我在2018年带队开发电商项目时就吃过这个亏一次手动部署导致线上样式错乱了半小时直接损失了几十万销售额。自动化部署的核心价值在于消除人为失误。根据2023年DevOps状态报告采用自动化部署的团队部署频率高出7倍而失败率却降低3倍。具体到前端项目一个完善的流水线能带来三个明显好处部署速度提升从原来的10分钟手动操作变成1分钟自动完成环境一致性通过Docker保证开发、测试、生产环境完全一致回滚机制任何版本都能快速回退再也不用担心这次更新后网站打不开了我们团队在引入这套方案后最直观的变化是新人入职第一天就能完成代码提交到线上部署的全流程再也不用老员工手把手教部署了。2. 环境准备与工具安装2.1 CentOS 7基础配置建议使用全新的CentOS 7系统开始我们的搭建。我习惯先做这些基础优化# 更新系统 yum update -y # 安装常用工具 yum install -y vim wget curl git # 关闭防火墙内网环境适用 systemctl stop firewalld systemctl disable firewalld # 设置时区 timedatectl set-timezone Asia/Shanghai重要提醒如果服务器有外网访问需求建议配置安全组规则而不是直接关闭防火墙。我们曾经有台测试服务器因为没做安全防护被植入了挖矿程序。2.2 Docker安装与优化原始文章已经给出了Docker安装步骤这里我补充几个实际工作中的实用技巧配置镜像加速创建或修改/etc/docker/daemon.json{ registry-mirrors: [ https://registry.docker-cn.com, https://mirror.ccs.tencentyun.com ], exec-opts: [native.cgroupdriversystemd] }日志限制防止Docker日志撑爆磁盘# 查看当前容器日志大小 docker inspect --format{{.LogPath}} 容器ID | xargs ls -lh # 全局配置日志大小限制 vim /etc/docker/daemon.json # 添加以下内容 { log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 } }常用命令别名添加到~/.bashrcalias dpsdocker ps --format table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}} alias dimgdocker images --format table {{.Repository}}\t{{.Tag}}\t{{.Size}}2.3 Jenkins的容器化部署原始文章使用的是jenkins/jenkins镜像但我更推荐使用jenkinsci/blueocean镜像它内置了更友好的流水线可视化界面docker run -d \ --name jenkins \ -u root \ -p 8080:8080 \ -p 50000:50000 \ -v /data/jenkins:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ jenkinsci/blueocean关键参数说明-v /var/run/docker.sock:/var/run/docker.sock让容器内能使用宿主机的Docker-u root避免权限问题生产环境建议使用特定用户第一次启动后获取管理员密码的方式docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword3. 构建自动化流水线3.1 Gitee仓库配置在Gitee上创建好项目后需要配置Webhook实现代码推送自动触发构建进入项目 → 管理 → WebHooks添加Hook URLhttp://你的Jenkins地址/gitee-project/项目名选择触发事件Push事件添加Jenkins凭证在Jenkins的凭据中添加Gitee API令牌避坑指南如果Jenkins部署在内网需要用内网穿透工具将Jenkins地址暴露给公网。我们团队用的是ngrok简单好用# 安装ngrok wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip unzip ngrok-stable-linux-amd64.zip # 启动穿透需要先注册账号获取token ./ngrok authtoken 你的token ./ngrok http 80803.2 Jenkins流水线脚本比起原始文章中的自由风格项目我更推荐使用Jenkinsfile声明式流水线。在项目根目录创建Jenkinsfilepipeline { agent any environment { NODE_VERSION 16.14.2 PROJECT_NAME your-project-name DEPLOY_PATH /home/www/your-project } stages { stage(Checkout) { steps { git branch: main, url: https://gitee.com/your-account/your-repo.git } } stage(Install) { steps { nodejs(nodeVersion: NODE_VERSION) { sh npm config set registry https://registry.npmmirror.com sh npm install } } } stage(Build) { steps { nodejs(nodeVersion: NODE_VERSION) { sh npm run build } } } stage(Deploy) { steps { sshPublisher( publishers: [ sshPublisherDesc( configName: your-ssh-server, transfers: [ sshTransfer( sourceFiles: dist/**, removePrefix: dist, remoteDirectory: DEPLOY_PATH, execCommand: chmod -R 755 /home/www/your-project ) ], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true ) ] ) } } } post { success { dingtalk ( robot: jenkins-robot, type: ACTION_CARD, title: 构建成功, text: [ ### 构建信息, - 项目: ${PROJECT_NAME}, - 版本: ${GIT_COMMIT}, - 构建: ${BUILD_NUMBER}, - 耗时: ${currentBuild.durationString} ].join(\n) ) } failure { dingtalk ( robot: jenkins-robot, type: ACTION_CARD, title: 构建失败, text: [ ### 构建失败, - 项目: ${PROJECT_NAME}, - 原因: 请检查构建日志, - 构建: ${BUILD_NUMBER} ].join(\n) ) } } }关键功能说明使用nodejs插件自动管理Node版本构建结果通过钉钉机器人通知团队部署后自动设置目录权限3.3 多环境配置策略实际项目中我们通常需要区分测试环境和生产环境。我的做法是通过Jenkins参数化构建在Jenkinsfile开头添加参数定义parameters { choice( name: DEPLOY_ENV, choices: [dev, prod], description: 选择部署环境 ) }修改环境变量部分environment { DEPLOY_PATH ${params.DEPLOY_ENV prod ? /home/www/prod : /home/www/dev} API_BASE ${params.DEPLOY_ENV prod ? https://api.example.com : https://dev-api.example.com} }在构建命令中注入环境变量stage(Build) { steps { nodejs(nodeVersion: NODE_VERSION) { sh export VUE_APP_ENV${params.DEPLOY_ENV} export VUE_APP_API_BASE${API_BASE} npm run build } } }这样在点击构建时就会弹出环境选择框同一个流水线可以适配不同环境。4. 高级优化与最佳实践4.1 构建缓存优化前端项目node_modules安装耗时是个痛点我通过两种方式优化使用cnpm替代npm在Jenkinsfile中添加stage(Install) { steps { nodejs(nodeVersion: NODE_VERSION) { sh npm install -g cnpm --registryhttps://registry.npmmirror.com cnpm install } } }缓存node_modules修改Docker挂载卷docker run -d \ ...其他参数... -v /data/jenkins:/var/jenkins_home \ -v /data/npm_cache:/root/.npm \ jenkinsci/blueocean4.2 镜像构建与部署对于需要Docker化的前端项目可以在流水线中加入镜像构建步骤stage(Build Image) { steps { script { docker.build(frontend:${BUILD_NUMBER}).push() } } } stage(Deploy) { steps { sshPublisher( publishers: [ sshPublisherDesc( configName: your-ssh-server, transfers: [ sshTransfer( execCommand: docker pull frontend:${BUILD_NUMBER} docker stop frontend || true docker rm frontend || true docker run -d \\ --name frontend \\ -p 80:80 \\ frontend:${BUILD_NUMBER} ) ] ) ] ) } }对应的Dockerfile示例FROM nginx:alpine COPY dist /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 804.3 监控与告警完整的流水线还需要监控机制。我通常会在两个层面添加监控构建过程监控通过Jenkins的Prometheus插件暴露指标应用运行监控在部署脚本中添加健康检查stage(Health Check) { steps { script { def response sh(returnStdout: true, script: curl -s -o /dev/null -w %{http_code} http://your-server/health ).trim() if (response ! 200) { error 健康检查失败HTTP状态码: ${response} } } } }这套方案在我们团队落地后前端项目的部署效率提升了80%线上故障减少了90%。最重要的是开发人员终于可以从繁琐的部署工作中解放出来专注于更有价值的代码开发。

更多文章