ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Jenkins实战:Vue+Spring Boot前后端自动构建与部署全流程

Jenkins实战:Vue+Spring Boot前后端自动构建与部署全流程 接手这个活儿之前我自己公司里就有一套跑了两年的 Jenkins 流水线后端是 Spring Boot 的 Maven 多模块工程前端是 Vue 2 的老项目后来又折腾过 Vue 3 Vite 的新项目。中间踩过的坑从 Jenkins 凭据配置、工作目录权限到 Vue 打包产物怎么塞进 Spring Boot 的静态目录基本都趟过一遍。这篇就按我的实操路线来写从准备环境开始到前后端各自的构建逻辑再到最终接到 Git 提交自动触发一条龙讲清楚。1. 为什么非要折腾自动构建手动打 war 包的日子我过够了先说一个很现实的场景。以前我负责的那个商城类项目后端是 Spring Boot MyBatis前端是 Vue 全家桶。每次要发测试环境流程是这样的本地先跑mvn clean package打包一个几百兆的 jar再跑前端npm run build出一堆 dist 文件然后手动把前后端的东西分别扔到服务器上。运气好一次通过运气不好后端编译报错、前端依赖装不上、接口地址配错来回折腾一个小时就没了。更要命的是如果团队里每个人都这么干谁也不知道线上跑的是哪一版代码。上了 Jenkins 自动构建之后整个流程变成代码推到 Git 仓库Jenkins 自动拉代码、自动装依赖、自动编译、自动打包、自动把产物扔到目标服务器。你只需要在提交信息里写清楚这次改了啥剩下的全部交给流水线。这个方案适合谁适合那种用 Git 管理代码、前后端分离、需要频繁更新测试环境或生产环境的团队哪怕只有三五个人也值得搞。我建议的第一步并不是马上去装 Jenkins而是先想清楚你要的“自动构建”到底包含哪几个环节后端拉代码 - 执行 Maven 编译打包 - 产出 jar/war 包前端拉代码 - 安装 npm 依赖 - 执行构建 - 产出 dist 静态资源发布把后端包推送到应用服务器把前端 dist 同步到 Nginx 或拷贝进 Spring Boot 的 static 目录触发手动点按钮触发或者 Git 提交后自动触发这四条线理明白了后面配置 Jenkins 就是往这四步里填具体命令的事。2. 环境准备Jenkins 本体、必要插件和凭据配置2.1 安装方式怎么选Jenkins 的装法有几种官方 war 包直接丢进 Tomcat、系统服务方式安装、Docker 方式。我强烈建议用 Docker 方式原因很简单——干净卸载也干净。Jenkins 自己会生成一堆 workspace、插件、构建历史如果用系统服务装时间长了系统目录里全是它留下的东西看着心烦。用 Docker 跑 Jenkins 的时候注意挂载两个目录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第一个是 Jenkins 的家目录必须持久化不然重启容器构建记录和配置全没了。第二个是 Docker 的 socket这步是给“流水线里再套 Docker 容器”做准备的比如让后端构建在 Maven 容器里跑前端构建在 Node 容器里跑这样宿主服务器上什么都不用装。安装完成之后浏览器访问服务器IP:8080初始化密码在容器的日志里用这条命令看docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword2.2 必须装的插件Jenkins 初始化的时候会让你选插件我建议选“自定义安装”别全装。真正用得上的其实就这几个表格里列一下插件名称用途Git Plugin从 Git 仓库拉代码Pipeline用流水线脚本定义构建步骤Credentials Binding在流水线里安全引用账号密码或 TokenDocker Pipeline如果构建要在容器里跑用这个SSH Server / Publish Over SSH把构建产物传到应用服务器Blue Ocean可视化查看流水线执行过程新手必备Extended Choice Parameter构建时手动选择分支或环境用后面几个插件是锦上添花前三个是刚需。没有 Credentials Binding后面 Git 凭据、服务器 SSH 凭据都配不了。2.3 Jenkins Credentials 配置细节这个点必须单独讲因为很多教程直接跳过导致新手上来就卡住。热搜词里有“jenkins credentials配置”足见这是个高频问题。进入 Jenkins 后台点“管理 Jenkins - 凭据 - 全局”(Manage Jenkins - Credentials - Global)然后添加凭据。这里分两种情况第一种拉取 Git 仓库需要账号密码或 Token。如果 Git 仓库用的是 GitLab建议用 Access Token别用账号密码。个人访问令牌在 GitLab 的个人设置里生成勾选read_repository权限就够了。添加凭据时类型选“Username with password”Username 随便填一个标识比如gitlab-tokenPassword 填那一串 token 值ID 写上gitlab-token方便流水线引用。第二种把构建产物通过 SSH 传到应用服务器。通常的做法是生成一对 SSH 密钥公钥放进应用服务器的~/.ssh/authorized_keys私钥配置到 Jenkins 凭据里。类型选“SSH Username with private key”把私钥内容粘进去同时填上服务器登录用户名。这里有个容易踩的坑私钥格式必须是-----BEGIN RSA PRIVATE KEY-----开头的 PEM 格式拿到的私钥是 PuTTY 的.ppk格式的话要用 PuTTYgen 先转换成 OpenSSH 格式。设置完凭据之后在 Pipeline 脚本里的引用长这样stage(Checkout) { steps { git( url: https://gitlab.example.com/team/shop-backend.git, credentialsId: gitlab-token, branch: ${BRANCH_NAME} ) } }注意这里用的是credentialsId就是添加凭据时填的 ID不是显示名称。2.4 启动目录和工作目录的坑“jenkins启动目录”这个热搜词我也要说一下。Jenkins 的工作目录默认是$JENKINS_HOME/workspace每个任务在这个目录下有自己的子目录。我见过太多人把构建产物输出到 Jenkins 的安装目录里然后又因为权限不足报错。解决思路很简单流水线里一律用相对路径或环境变量引用工作目录不要写死绝对路径。比如后端构建的 jar 包会输出在target/目录前端构建的产物会输出在dist/目录后续步骤要的就是这两个相对路径。另外 Jenkins 提供了几个环境变量在流水线里非常常用我列一下我用过的环境变量含义WORKSPACE当前任务的工作目录所有构建文件都在这JENKINS_HOMEJenkins 的家目录BUILD_NUMBER当前构建的编号可以用来做版本号BRANCH_NAME当前构建的分支名多分支流水线时GIT_COMMIT当前构建对应的 Git 提交 ID构建打包的时候我会把BUILD_NUMBER拼进 jar 包文件名里比如shop-admin-${BUILD_NUMBER}.jar这样测试返工找问题是哪个包一目了然。3. 前端 Vue 项目构建的核心逻辑3.1 Node 环境装在哪很多小白装 Jenkins 的时候直接在宿主机上装了 Node然后在 Jenkins 里用。这么做不是不行但不够优雅。更好的办法是让前端构建跑在独立的 Node 容器里跟宿主机的环境完全隔离。如果不爱用 Docker就老老实实在宿主机装 Node然后配置 Jenkins 的全局工具。在“管理 Jenkins - 工具 - NodeJS installations”里添加一个 Node 安装。这里容易踩的坑是Jenkins 装 Node 是在线下载的网络不稳定会卡很久而且下载位置在$JENKINS_HOME/tools一旦卡断下次还得重来。所以我建议直接在宿主机上手动装好 Node然后 Jenkins 里工具填那个安装路径。装了 Node 之后记得在流水线里声明一下要用哪个 Node语法是tools { nodejs node-18 }node-18这个名字是在 Jenkins 全局工具里配置的 Name。3.2 前端构建的完整 Pipeline 片段我写过一段比较完整的前端构建片段直接贴出来stage(Frontend Build) { steps { script { dir(shop-frontend) { // 锁定 npm 源避免网络问题导致依赖装不上 sh npm config set registry https://registry.npmmirror.com // 安装依赖CI 模式避免交互 sh npm ci --no-audit --no-fund // 构建生产包 sh npm run build:prod } } } }几个细节说一下为什么用npm ci而不是npm installnpm install会读 package.json 的版本范围可能装出和本地不一致的依赖版本而npm ci严格按照 package-lock.json 安装保证每次构建的依赖版本一模一样。我见过一个前端项目本地开发好好的Jenkins 构建完页面样式全乱一查就是npm install把某个依赖升了级。设置 taobao 镜像的问题。如果你在境外有可用的 npm 源那无所谓但国内服务器装依赖经常卡死设置镜像源属于常规操作。我自己用的是npmmirror.com稳定。这里注意镜像源只管 npm 包不管其他第三方工具如果项目里用到 puppeteer 这种还要单独配下载源。前端多环境构建。我见过很多npm run build:prod写死的情况但实际项目可能有 dev、test、prod 三个环境。我的做法是给流水线加一个参数用 Jenkins 的 Extended Choice Parameter 做一个下拉框让用户选环境然后脚本里根据环境变量取不同的.env文件举例如下parameters { choice(name: ENV, choices: [dev, test, prod], description: 构建环境) } stage(Frontend Build) { steps { sh npm run build -- --mode${ENV} } }Vue CLI 的项目支持--mode指定环境对应的.env.test、.env.prod文件里写不同的接口地址这样代码里不需要硬编码环境相关的配置。3.3 Vue 项目里的依赖问题处理Vue 项目构建最常见的报错就是Failed to download或node-sass安装失败。node-sass这个老顽固依赖需要从 GitHub 下载二进制文件国内访问经常超时。解决办法是给 npm 配一个变量npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass如果是 Vue 3 Vite 项目大多用sass或者dart-sass这个问题基本不存在了但可能遇到vue/tsconfig找不到的问题。热搜词里有“failed to load tsconfig vue/tsconfig/tsconfig.web.json: tsconfig not found”这个我遇到过多半是 tsconfig.json 里引用了外部依赖但依赖没装全。解决办法很简单全局搜索 tsconfig.json 文件确认extends路径指向的包确实存在于 node_modules 里没有就把包加到 devDependencies。另外Vue 项目构建报内存不足也是个高频问题。构建的 UI 库包含大量组件时webpack 或 Vite 构建可能把 Node 内存打爆报错信息一般是JavaScript heap out of memory。处理办法是在构建命令前加一段NODE_OPTIONS--max-old-space-size4096 npm run build:prod4. 后端 Spring Boot 项目的构建逻辑4.1 Maven 编译的 Pipeline 片段后端构建的逻辑相对简单核心就是 Maven 打包。我用的片段如下stage(Backend Build) { steps { script { dir(shop-backend) { sh mvn clean package -DskipTests -P${ENV} } } } }参数-P${ENV}是 Maven 的 profile我的项目里在 pom.xml 配置了 dev、test、prod 三套 profile对应不同的数据库、Redis、OSS 等配置。这样同一个 jar 包在测试环境和生产环境加载的配置文件不一样。这个不建议把配置写在 application.yml 里然后让服务器手动改那样又回到手工操作的老路了。4.2 Maven 多模块项目的聚合构建如果 Spring Boot 项目是 Maven 多模块结构比如像“多商户跨境商城”那种有shop-common、shop-admin、shop-api、shop-mapper等多个模块打包之前必须先构建公共模块。如果不做处理直接进到子模块目录执行mvn package会报找不到依赖的错。解决办法有两种第一种在最外层目录执行mvn clean packageMaven 的 reactor 机制会按依赖顺序自动编译整个项目但这样会把所有模块都打包速度慢。第二种只构建你需要的模块用-pl和-am参数mvn clean package -pl shop-admin -am -DskipTests-pl指定要构建的模块-am表示同时构建依赖的上游模块。注意必须在父 pom 目录执行这条命令而且模块之间的依赖必须声明在dependencies里不能是本地手动 install 的。4.3 Maven 仓库配置的几个小问题Maven 构建最磨人的就是依赖下载。我遇到的坑主要是私服和中央仓库切换的问题。很多公司内部有自己的 Maven 私服Nexus但如果 Jenkins 的配置文件指向私服本地开发指向中央仓库可能导致两边依赖版本不一致。我的做法是让 Jenkins 的~/.m2/settings.xml与团队内部保持一致配置文件统一维护。settings.xml里还有一个容易忽略的点本地仓库位置。我见过 Jenkins 环境里 Maven 的本地仓库默认在/root/.m2/repository如果磁盘满了构建会不稳定。建议把本地仓库指到一个独立的大分区比如/data/maven_repositorylocalRepository/data/maven_repository/localRepository另外Maven 构建的时候需要 JDK。如果你项目用的是 JDK 17Spring Boot 3 要求而 Jenkins 宿主环境默认是 JDK 8构建会直接失败。这个在 Jenkins 全局工具里配好 JDK 路径然后流水线里用tool声明tools { jdk jdk17 }4.4 Spring Boot 常见的脚本启动方式后端 jar 包进了服务器怎么启动也有讲究。我以前用nohup java -jar硬启动后来发现进程管理太乱了。改用 systemd 管理 Spring Boot 服务写一个 service 文件就可以用systemctl restart shop-admin来重启服务配合 Jenkins 的发布步骤很方便。systemd 服务文件核心内容大概这样[Unit] DescriptionShop Admin Service Afternetwork.target [Service] Userdeploy ExecStart/usr/bin/java -Xms512m -Xmx1024m -jar /data/apps/shop-admin.jar SuccessExitStatus143 [Install] WantedBymulti-user.target然后 Jenkins 发布步骤里就是标准的 SSH 操作把新 jar 包用scp推到服务器的临时目录systemctl stop shop-admin备份旧 jar 包用新 jar 包替换旧的systemctl start shop-admin这套动作下来发布过程从手动半小时缩短到三分钟。5. 前后端产物整合把 Vue 打包结果放进 Spring Boot 的标准姿势热搜词里有个很经典的表述vue打包放进springboot中。这其实是很多单应用部署场景的真实需求——不想单独配一台 Nginx希望一个 jar 包跑起来前后端都齐活。我接过一个内部系统就是这么干的Spring Boot 做后端Vue 做前端最后打成一个 jar部署简单极了。5.1 为什么会有这种需求单独部署前端到 Nginx后端跑 jar这是标准做法灵活、可以独立扩缩容。但有些场景不适合拆用户量不大单独为前端配一台服务器浪费部署环境复杂能少一个组件就少一个组件前后端都是由同一个小组维护不打算拆开发布节奏这种情况下把 Vue 构建出来的 dist 目录拷到 Spring Boot 的src/main/resources/static下打包成一个 jar浏览器直接访问http://ip:8080就能打开页面API 请求走同源也不存在跨域问题挺省心。5.2 流水线里的整合步骤在 Jenkins 流水线里整合逻辑其实就是文件拷贝。我的做法是先构建前端、再构建后端中间把 dist 内容拷贝到后端的静态资源目录stage(Frontend Build) { steps { dir(shop-frontend) { sh npm ci --no-audit --no-fund sh npm run build:prod } } } stage(Merge Frontend Artifact) { steps { dir(shop-backend) { // 清掉上一次的静态资源避免旧文件残留 sh rm -rf src/main/resources/static/* // 把前端产物拷到后端静态目录 sh cp -r ../shop-frontend/dist/* src/main/resources/static/ } } } stage(Backend Build) { steps { dir(shop-backend) { sh mvn clean package -DskipTests } } }几个容易忽略的细节第一路由模式。Vue Router 有 hash 和 history 两种模式。如果最终是打进 Spring Boot 的 jar强烈建议用 hash 模式。因为 history 模式依赖服务器的路由重写规则全部请求都要指到index.htmlSpring Boot 默认的静态资源服务做不到这一点一刷新页面就是 404。除非你在后端自己写一个转发 Controller否则别在单 jar 部署场景用 history 模式。第二资源路径。Vue 项目打包的时候publicPath会影响所有静态资源的引用路径。如果是放在 Spring Boot 的 static 根目录publicPath设置成./或/都可以但如果你把前端文件放在 static 下的子目录那就得改成相对路径./否则资源加载不出来。这个坑我在迁移老项目的时候踩过页面打开是白的控制台一堆资源 404。第三接口地址。前端项目通常有个.env.production配置接口地址。打成 jar 之前必须确认接口地址是用相对路径调用比如/api还是写死了http://localhost:8080。写死绝对地址的后果是换个服务器部署就得改前端代码重新打包。我的习惯是统一用/api相对路径然后 Spring Boot 配置里加一个 context-path 或者网关转发。5.3 整合方案的优点和代价优点很明显部署简单、资源统一、无跨域。代价也不能忽视。前端任何一点改动后端 jar 也要重新打一次构建时间变长如果前端文件多static目录膨胀jar 包体积变大下载和启动都变慢。所以我的原则是内部管理系统、用户量小的工具型应用用整合方案面向公网、用户量大、需要前后端独立扩缩容的项目还是老老实实分开部署。6. Jenkins Pipeline 完整示例与外部触发器配置6.1 一套完整的 Jenkinsfile 长什么样前面拆开讲了每个环节这一节给一个完整的 Jenkinsfile把前后端构建、产物整合、发布到服务器串起来。这份脚本我实际跑过可以直接当作模板改。pipeline { agent any parameters { choice(name: ENV, choices: [dev, test, prod], description: 选择构建环境) string(name: BRANCH_NAME, defaultValue: develop, description: 要构建的分支名) booleanParam(name: DEPLOY, defaultValue: true, description: 构建后是否自动发布) } tools { nodejs node-18 jdk jdk17 } stages { stage(Checkout) { steps { git( url: https://gitlab.example.com/team/agg-platform.git, credentialsId: gitlab-token, branch: ${params.BRANCH_NAME} ) } } stage(Frontend Build) { steps { dir(shop-frontend) { sh npm config set registry https://registry.npmmirror.com sh npm ci --no-audit --no-fund sh npm run build:${params.ENV} } } } stage(Merge Frontend Artifact) { steps { dir(shop-backend) { sh rm -rf src/main/resources/static/* sh cp -r ../shop-frontend/dist/* src/main/resources/static/ } } } stage(Backend Build) { steps { dir(shop-backend) { sh mvn clean package -DskipTests -P${params.ENV} } } } stage(Archive Artifacts) { steps { // 保存构建产物方便离线下载 archiveArtifacts artifacts: shop-backend/target/*.jar, fingerprint: true } } stage(Publish to Server) { when { expression { return params.DEPLOY } } steps { script { def serverEnv params.ENV def jarFile shop-backend/target/shop-admin.jar // 使用 SSH 凭据发布server 地址根据环境选择 sshPublisher( publishers: [ sshPublisherDesc( configName: app-server-${serverEnv}, transfers: [ sshTransfer( sourceFiles: jarFile, remoteDirectory: /data/apps/, execCommand: systemctl restart shop-admin ) ] ) ] ) } } } } post { success { echo 构建成功 } failure { echo 构建失败请检查日志 } } }这里强调一个点如果把 Jenkinsfile 放在项目的根目录并且叫这个名字Jenkins 的多分支流水线Multibranch Pipeline会自动识别它。也就是说你只需要在 Jenkins 上创建一个多分支任务指向仓库之后新建分支、提交代码都不需要再手动创建任务了非常方便。6.2 Webhook让 Git 提交自动触发构建前面一直在讲手动触发真正省事的还是 Git 提交后自动触发。这个场景热搜词里也有“jenkins自动部署”就是这个意思。配置方法分两步第一步Jenkins 侧安装插件并开启触发。如果用的 GitLab装 GitLab Plugin如果是 GitHub装 GitHub Integration Plugin。然后在任务配置页勾选“Build when a change is pushed to GitLab”或“GitHub hook trigger for GITScm polling”。第二步Git 仓库侧配置 Webhook。在 GitLab 的项目设置 - Webhooks 里填 Jenkins 的地址加上触发路径形如http://jenkins服务器IP:8080/project/任务名注意 Jenkins 2.x 以后的触发地址格式变了。我的经验是直接用流水线脚本做触发更简单triggers { gitlab(triggerOnPush: true, triggerOnMergeRequest: true) }这样 Jenkinsfile 本身能声明触发条件就不用在界面上点来点去了。GitLab 和 Jenkins 的通信需要 Jenkins 地址能被 GitLab 访问同一内网下没问题跨公网的话注意防火墙放行 8080 端口。踩过的坑提醒一下配置完 Webhook 一定要用 GitLab 自带的“Test”按钮测一下能通就说明配置成功。我见过有人的 Webhook 显示200 OK但 Jenkins 任务根本没被触发原因是 Jenkins 的 CSRF 校验不过。解决办法是在“管理 Jenkins - 全局安全配置”里把 GitLab 请求的 CSRF 豁免打开或者用 Jenkins 官方推荐的 API Token 方式。6.3 构建策略什么时候该自动什么时候该手动全自动听起来美好但我在实践中发现完全自动不一定是最优解。生产环境发布我建议加上人工确认的环节。Pipeline 里有现成的input步骤stage(Confirm Deploy to Prod) { when { expression { return params.ENV prod } } steps { input message: 确认发布到生产环境, ok: 确认 } }这样开发环境、测试环境可以全自动一旦分支是 prod流水线会暂停必须有权限的人在 Jenkins 上点一下“确认”才继续有效避免手滑把测试包发到生产。测试环境构建则尽量自动化。每个分支推上去都跑一遍流水线有问题早暴露比攒到最后再合一天到晚修冲突要强多了。多分支流水线在 Jenkins 里配置好之后Git 里新建分支会自动生成对应的任务删掉分支任务也会自动清理这种机制让团队协作省心不少。7. 我在实际运行中遇到的五个典型问题这部分记录几个真实遇到过的故障每一个我都花了不少时间排查写出来给你省点时间。7.1 凭据拉取仓库总是 401现象凭据配置没问题Git 地址也没错但 Jenkins 拉代码的时候一直报Authentication failed。排查链路检查凭据 ID 是否和流水线里的credentialsId完全一致包括大小写确认 GitLab 账号的 Token 还有效有可能 Token 过期了确认 Token 的权限范围至少要包含read_repository如果仓库是子模块还要确认子模块拉取时走的也是这个凭据。我最终的问题出在 Token 权限范围没勾选完整重建一个 Token 后立即解决。7.2 Vue 构建产物是空的现象npm run build 执行成功了Jenkins 日志显示 exit 0但dist目录是空的。排查链路看构建脚本里有没有配置 outDirVite 项目默认是distwebpack 项目默认也是dist确认构建是在哪个目录下执行的dir(shop-frontend)包裹得对不对如果用了npm run build -- --modetest确认 package.json 里的 script 是不是真的能接收这个参数。这个问题让我印象最深的是前端工程师本地构建正常Jenkins 构建出来是空目录。最后定位到是 webpack 配置里有process.cwd()的调用本地执行时 cwd 在项目根目录Jenkins 执行时 cwd 在 workspace 根目录导致输出路径跑偏了。解决办法是 webpack 配置里用__dirname代替process.cwd()来拼绝对路径。7.3 Maven 依赖漂移构建一半突然失败现象同一个 Jenkinsfile上周跑是好的这周跑到一半报某个依赖下载失败。排查链路先看是哪个依赖下载失败去私服或中央仓库确认版本是否存在检查是不是本地仓库有损坏的.lastUpdated文件这种文件代表之前下载失败了Maven 可能不会自动重试处理办法是把~/.m2/repository下对应目录删了重新构建或者加-U参数强制更新快照依赖。我的建议是给 Maven 构建命令加上-U虽然会降低一点速度但能避免很多诡异问题。7.4 前端构建内存溢出现象Vue 项目构建时偶尔报FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory。排查链路这是 Node 默认内存上限约 1.5GB不够用了。解决办法就两个一是按前面说的设置NODE_OPTIONS--max-old-space-size4096二是排查是不是有某个页面引入了超大依赖比如把整个 UI 库全量引入改成按需引入之后内存占用能降一半。我的建议是两种手段同时上因为就算调大内存构建速度也不会因此变快。7.5 Jenkins 构建机时间不准导致版本号错乱现象jar 包里的构建时间、Git 提交记录里的时间和实际时间对不上排查问题时很迷惑。原因Jenkins 容器的时区默认是 UTC构建机上执行date看到的是 UTC 时间比北京时间慢八小时。解决办法启动 Docker 容器的时候挂载-e TZAsia/Shanghai或者构建脚本里sh TZAsia/Shanghai date来校验。这个坑很隐蔽但一旦涉及到按时间戳找版本的问题会非常痛苦。8. 往后可以扩展的方向这套流程跑通之后你会觉得越来越顺手但千万别停在原地。我自己的下一步实践方向大概有这么几个流水线即代码彻底化。现在 Jenkinsfile 已经放在仓库里了但还有人习惯在界面上改任务参数这失去了把配置当代码管理的意义。最好连 Jenkins 任务的定义都用 Job DSL 或 Configuration as Code 插件来管理这样整个 Jenkins 配置都可以放进 Git 仓库换了新服务器一键还原。构建容器的标准化。后端构建用 Maven 容器前端构建用 Node 容器每个项目的构建环境都用一个 Dockerfile 定义锁死版本。这样不管 Jenkins 跑在哪台机器上构建环境永远一致不会出现“我这台机器上能过Jenkins 上过不了”的问题。结合容器化部署。Spring Boot 项目打的 jar 包下一步可以做成 Docker 镜像推到私有仓库然后触达测试环境或生产环境。Jenkins 在这个链路上变成了镜像构建与发布平台而不只是包管理工具。加上质量门禁。后端构建前跑一下单元测试和 SonarQube 扫描前端构建前跑一次 ESLint任何一步不通过都中止流水线。这能倒逼团队提高代码质量而不是只关心“能不能跑起来”。我把这套自动构建方案搭好之后最大的体感就是“能去干正事了”。以前每周五下午都提心吊胆怕测试环境部署出错周六还得回公司救火。现在代码一推流水线自己跑完该发布的发布该通知的通知我只需要看一眼终端。希望这篇实战记录能帮你少走点弯路要是你照着配置的时候踩到了别的坑不妨复盘一下——大概率是你现在的环境里也有我之前遇到的那五个问题之一。
返回列表