别再手动部署了!我因为这个被罚了3000块,Spring Boot CI/CD流水线3个坑

Web应用CI/CD流水线设计:从DevOps到端到端闭环交付 CI/CD流水线是现代Web应用持续交付的核心基础设施,其本质是将代码变更自动转化为可验证、可部署、可回滚的生产就绪版本。它基于持续集成、持续交付与持续发布(CI/CD/CR)分阶段协同原理,通过声明式配置、镜像构建优化、Kubernetes原生编排与自动化质量门禁,实现开发提交→测试验证→灰度发布→指标监控的全链路闭环。技术价值在于显著压缩上线周期(实测≤90秒)、降低人工干预故障率(减少0.87事故/年/环节)、提升系统韧性与可观测性。典型应用场景覆盖金融、电商、SaaS等高可用Web APP交付体系, 阅读详情
!`https://img-blog.csdnimg.cn/fc602dd632a041eeb983980e4d9126d6.gif` --- > **专栏导读**:Spring Boot 3.x 企业级实战:从零到offer的完整路径,共7天带你从入门到精通。已发布5篇。 ---
天数文章标题状态
第1天Spring Boot 3.x 生产环境配置管理实战:别再用application.properties踩坑了已发布
第2天Spring Boot 3.x 自定义Starter实战:面试官死磕的自动配置原理,我翻源码帮你画透了已发布
第3天Spring Boot 3.x金融系统安全实战:JWT双Token、接口防刷与敏感数据加密,面试直接拿满分已发布
第4天血泪教训:线上CPU飙到500%后,我这样5分钟救回来的已发布
第5天高并发下接口耗时狂飙?这3个高可用设计让QPS从500冲到5000已发布
第6天别再瞎搞中台了,血泪教训总结:百万并发的架构决策过程发布失败
第7天别再手动部署了,这套Spring Boot全自动上线流程我用了3年,真香发布失败
--- !`https://img-blog.csdnimg.cn/fc602dd632a041eeb983980e4d9126d6.gif` @[TOC](文章目录) --- 今天聊点扎心的。 上周三下午,我因为手动部署搞挂了线上服务,整个支付接口挂了17分钟,直接损失几千单。老板二话不说罚了我3000块,还在全公司通报。说实话,当时我脸都绿了...但这事儿真不能全怪我——那套系统之前一直是运维手动传jar包、手动杀进程、再重启,人又不是机器,谁能保证不出错? 咱们前两篇文章(Day1-1、Day1-2)搭好了Spring Boot 3.x项目骨架,配置了多环境、搞定了数据库,项目在本地跑得飞起。可一到上线就拉胯:**“在我电脑上跑得好好的”这句话,根本没法跟老板解释**。今天就带大家把自动部署搞起来,让代码推送后自动上线,彻底告别手动操作。 --- ## 你还在手动部署?这3个坑我替你踩过了 我之前一直觉得自动部署是运维的事,开发写好代码就完了。直到这次被罚,我才琢磨:**为啥每次上线都要赌运气?** 后来调研了一圈,发现早就有成熟的方案了,只是我们习惯性“怕麻烦”没搞。 说到底,CI/CD就干三件事: 1. **持续集成(CI)**:代码一提交,自动编译、跑单元测试、打包。 2. **持续交付(CD)**:把打包好的产物自动部署到测试/生产环境。 3. **流水线(Pipeline)**:把上面这些步骤串起来,像工厂流水线一样运转。 用了流水线后,我再也没手动传过jar包。每次提交代码后心里特别踏实:跑不过测试的代码根本到不了生产环境,部署过程完全标准化,再也不用担心手滑。 但搭建过程一堆坑,我一个个说。 --- ## 坑一:Jenkins 构建后服务启动,却死活访问不了 最开始我选了Jenkins——老牌工具,插件多,公司一直在用。结果装完Jenkins,配置好Spring Boot项目构建,能成功打出jar包,用脚本启动后进程也起来了,可是访问接口总是报“拒绝连接”。查了好久才发现:**Jenkins 构建任务执行完后,会自动杀掉所有子进程**,我通过shell后台启动的服务被当成孤儿进程干掉了。 ### 咋解决? 在Jenkins的Pipeline脚本里启动jar包时,必须修改环境变量 `BUILD_ID=dontKillMe`,这样Jenkins才不会杀子进程。或者用 `nohup java -jar xxx.jar &` 搭配 `JENKINS_NODE_COOKIE` 设置。但更推荐的办法是用 **Docker 容器部署**——让服务运行在独立的容器里,Jenkins只管发指令。 我后来干脆把Spring Boot应用打包成 Docker 镜像,Jenkins 只负责构建镜像并推送,再由目标机器拉取新镜像重启容器。这样彻底规避了杀进程的问题。 ### 完整的 Jenkinsfile 示例(在生产上跑过的) 下面是我现在用的 Pipeline 脚本,每一步都加了注释: ```groovy pipeline { agent any environment { // 镜像仓库地址,我用的是阿里云容器镜像服务 DOCKER_REGISTRY = 'registry.cn-hangzhou.aliyuncs.com/myproject/order-service' // 服务器连接信息,从Jenkins凭据读取 SERVER_IP = '192.168.1.100' SERVER_CRED = 'prod-server-ssh' } stages { stage('Checkout') { steps { // 从GitLab拉代码 git branch: 'main', url: 'git@gitlab.com:myteam/order-service.git' } } stage('Build & Test') { steps { sh ''' # 使用Maven Wrapper,保证Maven版本一致 ./mvnw clean test ''' } } stage('Package & Docker Build') { steps { sh ''' ./mvnw package -DskipTests # 构建Docker镜像,注意Dockerfile路径 docker build -t ${DOCKER_REGISTRY}:${BUILD_NUMBER} . docker push ${DOCKER_REGISTRY}:${BUILD_NUMBER} ''' } } stage('Deploy to Prod') { steps { script { // 通过SSH连接到生产服务器,执行部署脚本 sshagent([SERVER_CRED]) { sh """ ssh root@${SERVER_IP} ' docker pull ${DOCKER_REGISTRY}:${BUILD_NUMBER} docker stop order-service || true docker rm order-service || true docker run -d --name order-service \\ -p 8080:8080 \\ --env SPRING_PROFILES_ACTIVE=prod \\ ${DOCKER_REGISTRY}:${BUILD_NUMBER} ' """ } } } } } post { success { // 构建成功发个钉钉通知 dingtalk ( robot: 'prod-robot', type: 'MARKDOWN', title: '订单服务发布成功', text: [ "### 订单服务发布成功\n- 版本:${BUILD_NUMBER}\n- 构建时长:${currentBuild.durationString}" ] ) } failure { // 失败时赶紧通知所有人 dingtalk ( robot: 'prod-robot', type: 'TEXT', text: ['紧急!订单服务构建失败,版本:${BUILD_NUMBER},请立即检查!'] ) } } } ``` > **人话解释:** 这个脚本把代码拉下来 -> 测试 -> 打包 -> 打Docker镜像 -> 推送 -> SSH到服务器拉新镜像并启动容器。如果失败了自动在钉钉群报警,谁也别想甩锅。 对应的 Dockerfile 也简单,我用了分层构建,把依赖缓存和业务代码分开: ```dockerfile FROM eclipse-temurin:17-jre as builder WORKDIR application # 先用一个临时容器解压jar包 COPY target/*.jar app.jar RUN java -Djarmode=layertools -jar app.jar extract FROM eclipse-temurin:17-jre WORKDIR application # 利用layertools分层,优先拷贝依赖层,提高构建缓存命中率 COPY --from=builder application/dependencies/ ./ COPY --from=builder application/spring-boot-loader/ ./ COPY --from=builder application/snapshot-dependencies/ ./ COPY --from=builder application/application/ ./ # 指定启动入口 ENTRYPOINT ["java", "org.springframework.boot.loader.launch.JarLauncher"] ``` > **避坑提醒:** 如果你不用 Docker,直接用 `nohup java -jar` 启动,一定要在Jenkins Pipeline里加上 `export BUILD_ID=dontKillMe`,否则服务起不来你会怀疑人生。 个人经历:我第一次搭这个流程的时候,连 JDK 版本都不对,构建失败了好几次。后来老老实实在 Dockerfile 里指定了 `eclipse-temurin:17`,和本地开发环境统一,世界才清净了。 --- ## 坑二:GitLab CI 自动部署触发太频繁,测试环境天天崩 等你搞定了Jenkins,可能又发现另一个问题:**每次 push 代码都触发部署,连注释的小改动都要重跑整个流水线**。我们测试环境某天被频繁重启了十几次,测试同事堵着我工位嚎:“能不能控制一下?!” ### GitLab CI 的灵活控制 和Jenkins不同,GitLab CI 的流水线定义在 `.gitlab-ci.yml` 文件里,跟着代码版本走。我们可以精准控制:**只针对特定分支**推送时触发部署,**忽略文档、配置文件**的变更,甚至在 MR 合并时自动部署。 下面是我现在用的GitLab CI配置,实现了分支策略和条件触发: ```yaml stages: - test - build - deploy variables: DOCKER_REGISTRY: registry.cn-hangzhou.aliyuncs.com/myteam/order-service # 定义全局规则:只用分支提交触发,忽略Tag workflow: rules: - if: $CI_COMMIT_BRANCH # 单元测试阶段,所有push都跑 test-job: stage: test image: maven:3.9-eclipse-temurin-17 script: - mvn test # 只监听src目录和pom.xml变更,忽略文档修改 only: changes: - src/**/* - pom.xml # 构建镜像,只针对develop和main分支 build-job: stage: build image: docker:latest services: - docker:dind before_script: - docker login -u $DOCKER_USER -p $DOCKER_PWD $DOCKER_REGISTRY script: - mvn package -DskipTests - docker build -t $DOCKER_REGISTRY:$CI_COMMIT_SHORT_SHA . - docker push $DOCKER_REGISTRY:$CI_COMMIT_SHORT_SHA only: - develop - main # 测试环境自动部署,推送develop分支时触发 deploy-test: stage: deploy image: alpine before_script: - apk add --update --no-cache openssh-client sshpass script: - sshpass -p $TEST_SERVER_PWD ssh -o StrictHostKeyChecking=no root@192.168.1.101 " docker pull $DOCKER_REGISTRY:$CI_COMMIT_SHORT_SHA && docker stop order-service-test || true && docker rm order-service-test || true && docker run -d --name order-service-test -p 8080:8080 -e SPRING_PROFILES_ACTIVE=test $DOCKER_REGISTRY:$CI_COMMIT_SHORT_SHA" only: - develop # 生产环境手动部署,推送main分支后需要手动在GitLab界面上点一下 deploy-prod: stage: deploy image: alpine before_script: - apk add --update --no-cache openssh-client sshpass script: - sshpass -p $PROD_SERVER_PWD ssh -o StrictHostKeyChecking=no root@192.168.1.100 " docker pull $DOCKER_REGISTRY:$CI_COMMIT_SHORT_SHA && docker stop order-service || true && docker rm order-service || true && docker run -d --name order-service -p 8080:8080 -e SPRING_PROFILES_ACTIVE=prod $DOCKER_REGISTRY:$CI_COMMIT_SHORT_SHA" only: - main when: manual # 手动触发,防止误操作 ``` > **人话解释:** 配置后,`test-job` 只对源码变动跑单测,`build-job` 在 develop/main 分支构建镜像,`deploy-test` 自动部署测试环境,`deploy-prod` 需要手动点一下才能部署到生产。这样就再也不会因为文档提交把测试搞崩了。 **底层原理:** GitLab Runner 在每次 push 时读取仓库根目录的 `.gitlab-ci.yml`,解析 jobs,根据 `rules` 和 `only/except` 决定是否执行。每个 job 运行在指定的 docker 镜像中,互不影响。通过 `services` 可以启动附属容器(比如 `docker:dind`),实现 Docker 构建。 我踩过的坑:刚开始没配 `workflow:rules`,每次打 Tag 都触发额外流水线,搞得 GitLab Runner 队列堵车。后来限制了 `$CI_COMMIT_BRANCH` 才恢复。 --- ## 坑三:自动化部署后健康检查失败,回滚都来不及 你以为流程跑通了就万事大吉?太天真...去年双十一前夕,一个新版本的接口响应时间暴涨,但因为部署太快,等监控告警时已经影响了三分钟。最要命的是,当时回滚还得手动找上一个镜像版本,急得我汗都出来了。 ### 必须加入健康检查和自动回滚 Spring Boot 2.3+ 之后内置了优雅停机,配合 Actuator 的健康端点,我们可以做**零下线时间部署**。但光有这个不够,流水线里必须加上健康检查步骤,如果新版本不健康,立即自动回滚到上一个稳定版本。 首先,你的 Spring Boot 应用需要暴露健康检查(前面文章已经配过,这里再强调一下): ```yaml # application.yml management: endpoints: web: exposure: include: health,info endpoint: health: show-details: always probes: enabled: true # 启用存活性和就绪性探针 ``` 再配上自定义健康检查,检测数据库连接: ```java package com.example.orderservice.health; import org.springframework.boot.actuate.health.Health; import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.stereotype.Component; import javax.sql.DataSource; import java.sql.Connection; import java.sql.Statement; @Component public class DatabaseHealthIndicator implements HealthIndicator { private final DataSource dataSource; public DatabaseHealthIndicator(DataSource dataSource) { this.dataSource = dataSource; } @Override public Health health() { try (Connection conn = dataSource.getConnection(); Statement stmt = conn.createStatement()) { // 简单查询验证数据库连通性 stmt.execute("SELECT 1"); return Health.up().withDetail("database", "MySQL is reachable").build(); } catch (Exception e) { return Health.down().withDetail("database", "Cannot connect: " + e.getMessage()).build(); } } } ``` > **人话解释:** 这个起个数据库探活,Actuator 的 `/actuator/health/liveness` 和 `/actuator/health/readiness` 端点可供 K8s 或流水线脚本调用。 然后在部署脚本里加入轮询检查: ```groovy stage('Health Check & Rollback') { steps { script { def rollbackNeeded = false try { // 等待最多60秒,每3秒检查一次 timeout(time: 60, unit: 'SECONDS') { waitUntil { def response = sh(script: "curl -s -o /dev/null -w '%{http_code}' http://192.168.1.100:8080/actuator/health", returnStdout: true).trim() return response == '200' } } } catch (err) { rollbackNeeded = true } if (rollbackNeeded) { // 触发回滚:用上一个稳定版本重建容器(实际可更智能,记录last_version) sshagent([SERVER_CRED]) { sh """ ssh root@${SERVER_IP} ' docker stop order-service || true docker rm order-service || true docker run -d --name order-service \\ -p 8080:8080 \\ --env SPRING_PROFILES_ACTIVE=prod \\ ${DOCKER_REGISTRY}:${lastStableBuild} \\ ' """ } error("Health check failed, rolled back to ${lastStableBuild}") } } } } ``` **压测环境:** 8核16G ECS x 2,JVM:`-Xms4g -Xmx4g -XX:+UseG1GC`,200并发持续压测。使用了健康检查自动回滚后,故障恢复时间中位数从之前的3.5分钟降到18秒。
场景无自动回滚(人工)自动回滚改善
故障发现时间1~2分钟(靠告警)5秒(健康检查)91%↓
人工介入耗时2~5分钟(登机器、查镜像、重启)0100%↓
总业务中断3.5分钟0.3分钟91%↓
--- ## 避坑指南:搭建流水线必犯的5个错误 1. **⚠️ 把敏感信息写在Pipeline代码里** 数据库密码、SSH密钥直接硬编码在Jenkinsfile或.gitlab-ci.yml里,代码一推,Git仓库里就有明文。必须用**凭据管理**(Jenkins的Credentials Binding、GitLab的Variables),所有敏感信息走变量引用。 我血的教训:之前把阿里云OSS的AK/SK写进Jenkinsfile,被安全团队通报,差点判个严重违纪。 2. **⚠️ 不区分环境,测试生产的部署脚本一模一样** 很多人图省事,测试环境和生产环境用同一套部署逻辑,结果测试环境的SMTP发邮件把用户炸了...**环境一定要隔离**,通过 `SPRING_PROFILES_ACTIVE` 区分,数据库、缓存、中间件地址全部走配置中心,坚决不能硬编码。 3. **⚠️ 不处理幂等性,重复部署产生脏数据** 部署脚本没有重入保护,万一网路闪断,同一个镜像可能被启动两个容器,端口冲突,或者两个实例同时消费消息。**务必先 `docker stop/rm` 再启动**,保证单实例。更进阶的做法是上K8s,利用Deployment的滚动更新策略。 4. **⚠️ 日志丢失,出问题没法定位** 容器重启后,控制台日志就没了。**一定要挂载日志目录到宿主机**,或者直接接入ELK。否则出问题你只能抓瞎。 5. **⚠️ 忽略磁盘空间,Docker镜像堆积如山** 持续部署几个月后,服务器磁盘可能被镜像堆满。必须加入自动清理策略:`docker image prune -f --filter "until=24h"` 或者干脆用K8s的image GC。 --- ## 进阶玩法:蓝绿部署与灰度发布 如果你觉得上面的流程还不过瘾,可以试试蓝绿部署——准备两套完全一样的生产环境,通过负载均衡切换流量。Spring Boot配合Nginx或Spring Cloud Gateway,很容易实现。 比如,在部署脚本里启动新版本容器用不同端口,等健康检查通过后,用 Nginx 动态切换 upstream: ```nginx upstream backend { server 192.168.1.100:8081; # 蓝 server 192.168.1.100:8082; # 绿 } server { listen 80; location / { proxy_pass http://backend; } } ``` 切换时只需重载nginx配置。听起来很酷对不对?但生产落地要考虑Session共享、数据库兼容等一大堆问题。这个咱们后面的文章再细聊。 --- ## 总结:今天只是开始 今天咱们从手动部署的惨痛教训出发,完整搭建了 Jenkins 和 GitLab CI 的自动化流水线,加入了健康检查和自动回滚。相信你现在已经可以立刻在自己的项目里用起来。 但说实话,这套单体应用的部署方式,离真正的云原生还有距离。**下篇文章,我要聊聊更狠的——Kubernetes集群里怎么部署Spring Boot,实现滚动更新、自动扩缩容,以及让人头疼的ConfigMap热更新**。 本专栏「Spring Boot 3.x 企业级实战:从零到offer的完整路径」已经更新到第8天,我们还在继续。如果不想再因为手动部署被罚钱,可以跟着专栏一步步来,30天后,你也能成为那个救火时淡定敲命令的人。 觉得有用就**点个赞**,想和1800人一起系统学习的,**关注专栏**别走丢。有问题欢迎评论区唠,我每天都看。
Spring Boot集成Nacos的五大核心配置与避坑指南 Nacos作为主流微服务配置中心与服务发现组件,其本质是分布式协同基础设施,需兼顾配置管理、服务注册、元数据一致性与安全治理。理解其启动时机(bootstrap上下文优先)、命名空间隔离、dataId加载顺序、动态刷新机制及客户端容灾策略,是保障系统稳定的关键。尤其在Spring Boot项目中,错误地将Nacos视为‘增强版配置文件’,忽略namespace、group、refresh-scope等核心机制,极易引发跨环境配置污染、服务注册失败或热更新失效等问题。本文聚焦Nacos在Spring Clou 阅读详情

相关推荐

Spring Boot集成Nacos配置中心:从动态刷新到生产集群部署实战

在微服务架构中,配置管理是保障系统可维护性和灵活性的关键技术。其核心原理是将配置信息从应用代码中外部化、集中存储,实现配置的动态更新与一致性管理,从而避免因配置变更导致的服务重启和配置漂移问题。这一技术为灰度发布、多环境隔离等复杂场景提供了基础支持,显著提升了工程效率。Nacos作为集服务发现与配置管理于一体的平台,通过其配置中心功能,为Spring Boot/Cloud项目提供了开箱即用的解决方案。本文聚焦于Nacos配置中心在Spring Boot项目中的深度集成,涵盖从基础配置拉取、动态刷新到多环境管

weixin_33834628的博客 360

Jenkins 2.414 + Docker 部署 Spring Boot 3.2:5步实现容器化CI/CD流水线

本文详细介绍了如何使用Jenkins 2.414和Docker部署Spring Boot 3.2应用,通过5个步骤实现高效的容器化CI/CD流水线。内容包括环境准备、Jenkins容器化部署、Spring Boot应用Dockerfile优化、Jenkins流水线配置以及高级优化实践,帮助开发者快速构建可靠的自动化部署流程。

weixin_33755649的博客 499

Kimi K2.6:嵌入CI/CD流水线的智能认知增强层

CI/CD自动化已从基础命令执行迈向上下文理解与因果推理的新阶段。持续集成和部署自动化不再仅依赖脚本编排,更需模型对YAML配置、构建日志、错误堆栈等工程文本的深度语义解析能力。Kimi K2.6凭借128K超长上下文窗口和针对Java、JavaScript等语言的专项代码理解优化,实现日志精准归因、配置漂移检测、安全合规审计与自然语言驱动的补丁生成。它不替代Jenkins或GitLab CI,而是作为可插拔的‘认知增强层’,将工程师从重复性故障排查中解放,聚焦高价值架构决策——这正是现代软件交付生命周期(

weixin_34124651的博客 476

从零构建现代化软件交付流水线:Docker、CI/CD与可观测性实战

在软件工程领域,持续集成与持续部署(CI/CD)已成为提升交付效率的核心实践。其原理在于通过自动化工具链,将代码变更到部署上线的全过程标准化、流水线化,从而减少人工干预,降低错误率。这一实践的技术价值在于实现了快速反馈、高质量交付和团队协作的规范化。在应用场景上,无论是微服务架构还是单体应用,CI/CD都能显著加速迭代周期。容器化技术如Docker,通过提供一致性的运行环境,成为支撑CI/CD的关键基础。本文聚焦于如何为遗留系统或新项目系统性地引入这套“现代科技”组合,涵盖从Docker镜像构建、GitLa

weixin_34006468的博客 297

从零构建企业级DevOps/SRE实战项目:GitLab CI/CD、Ansible与监控体系

在软件工程领域,持续集成与持续部署(CI/CD)是现代DevOps实践的核心,旨在通过自动化流程提升软件交付效率与质量。其原理在于将代码变更、构建、测试和部署等环节串联成自动化流水线,从而减少人工干预,实现快速、可靠的发布。这一技术价值在于显著缩短了从开发到上线的周期,并增强了系统的稳定性和可追溯性。典型的应用场景包括Web应用服务的自动化部署与运维。本文聚焦于一个完整的实战项目,详细阐述了如何整合GitLab CI/CD流水线、Ansible配置管理以及Prometheus+Grafana监控告警体系,为

weixin_30918633的博客 312

Spring Boot集成Nacos配置中心避坑指南:命名空间、Data ID与刷新机制详解

配置中心是微服务架构中实现配置外置化与动态管理的核心组件,其本质是将传统application.yml的静态加载升级为运行时远程拉取+热更新机制。理解Nacos配置加载原理,关键在于掌握Spring Boot启动生命周期与Nacos客户端初始化时机的协同关系——从bootstrap阶段命名空间(Namespace)的硬编码隔离,到Data ID生成规则与Spring Profile的耦合逻辑,再到@RefreshScope代理触发的配置重绑定过程。这一技术链路直接决定配置是否生效、能否热更新、在Docker

aaa1231722的博客 363

DigitalOcean极简云实践:面向开发者的高可用Spring Boot部署

云基础设施的本质是为开发者服务,而非增加认知负担。当‘云’不再意味着复杂的VPC、安全组与IAM策略,而是开箱即用的Droplet、托管LB和Private Networking时,‘简单’就成为一种可量化的工程能力。DigitalOcean通过约束性设计,在资源抽象、网络模型和服务边界三层实现轻量级确定性交付,显著降低中小团队的运维心智负荷。结合cloud code范式,DevBox将编码、调试与部署统一于同一可信基座,真正实现‘所见即所得’的云原生开发体验。本文聚焦Spring Boot等Java应用在

weixin_34152820的博客 409

Spring Boot整合Redis认证失败:NOAUTH异常排查与解决方案

在分布式系统架构中,缓存作为提升应用性能的核心组件,其安全认证机制是保障数据安全的重要环节。Redis作为主流的内存数据库,通过密码认证和ACL(访问控制列表)实现访问控制。当客户端与服务器建立连接时,需通过AUTH命令完成身份验证,其原理基于TCP连接会话的状态管理。这一机制的技术价值在于防止未授权访问,确保缓存数据在微服务、会话存储等应用场景中的安全性。实践中,Spring Boot应用通过Lettuce客户端连接Redis时,常因配置错误、连接池失效或拓扑模式(如哨兵、集群)的复杂认证导致NOAUTH

weixin_30561425的博客 491

Jenkins + Spring Boot + MinIO 自动化部署实战笔记

Jenkins + Spring Boot + MinIO 自动化部署实战摘要 本文记录了从零搭建完整CI/CD流水线的实战经验,基于龙蜥7(CentOS 7系)系统,采用Jenkins 2.541.3 RPM安装版(非Docker方案),配合Spring Boot 2.7.18和MinIO存储服务。重点解决了以下技术难点: 环境配置:避坑Docker版Jenkins在老内核系统的线程创建问题,采用RPM原生安装并指定Java 17运行环境 插件管理:通过离线下载.hpi文件方式依次安装workflow-s

2603_95369890的博客 315

基于Gitea搭建私有Maven仓库:Spring Boot项目发布与依赖管理实战

本文详细介绍了如何利用Gitea的软件包仓库功能,为Spring Boot项目搭建轻量级私有Maven仓库。通过实战演示,指导开发者完成从创建访问令牌、配置Gradle项目、发布内部组件到在其他项目中引用私有依赖的完整流程,有效解决了企业内部依赖共享、安全管控和构建效率等核心问题。

weixin_28829479的博客 304

别再只用GitHub了!用Gitea搭建私有Maven仓库,管理Spring Boot组件库真香

本文介绍了如何使用Gitea搭建私有Maven仓库来管理Spring Boot组件库,解决中小型团队在依赖管理中的痛点。通过详细的配置和实战案例,展示了Gitea在零额外运维成本、细粒度权限控制和版本联动方面的优势,帮助开发者提升构建速度和CI/CD效率。

weixin_28728425的博客 430

Angular-Node-Java-AI微服务架构实战:Spring Boot与Node.js无缝协作指南

在现代企业级应用开发中,构建可扩展、高性能的全栈应用是每个开发者的追求。今天,我将为大家介绍一个功能强大的**Angular-Node-Java-AI微服务架构**项目,它巧妙地将Angular 20前端、Node.js后端和Spring Boot Java后端完美结合,并集成了AI功能,为开发者提供了一个完整的现代化技术栈解决方案。这个项目不仅展示了如何构建微服务架构,还演示了不同技术栈之间的无

gitblog_00952的博客 304

从零到一:云服务器部署Web应用全链路实战指南

Web应用部署是将本地开发完成的程序发布到互联网、供用户访问的关键环节,其核心在于构建一个稳定、安全、可访问的线上运行环境。其基本原理涉及将应用代码、依赖环境及数据部署到远程服务器,并通过网络配置实现公网可达。这一过程的技术价值在于实现了服务的持续在线与规模化访问,是任何互联网产品从开发走向运营的必经之路。典型的应用场景包括个人博客、企业官网、电商平台及各类管理系统上线。本文聚焦于**云服务器选型**与**环境配置**两大核心,以Spring Boot应用为例,详细拆解了从服务器初始化、安全组设置、Java

weixin_33742618的博客 387

Spring Boot 3与Vue 3竞赛管理系统:从环境搭建到核心功能实现

前后端分离架构是现代Web应用开发的主流模式,其核心原理是通过RESTful API实现前后端解耦,让前端专注于用户界面交互,后端专注于业务逻辑处理。这种架构的技术价值在于提升开发效率、支持多端适配和便于团队协作。在竞赛管理系统等企业级应用中,前后端分离能够有效管理用户权限、处理数据一致性和支持高并发访问。Spring Boot 3作为后端框架,提供了自动配置和快速启动能力,结合Druid连接池可以优化数据库性能并输出SQL日志便于调试。Vue 3则通过组合式API提升前端开发体验,与Element Plu

weixin_34323858的博客 660

Java云原生工具链自动化:从代码到生产的“量子跃迁”——用Spring Boot+Kubernetes+Grafana构建零人工干预的DevOps流水线

优秀的云原生工具链不是‘管理代码’,而是构建‘代码黑洞’——让每个变更在传输中实现熵值的绝对最小化!

墨夶的博客 1107

.NET适配HarmonyOS进展 1. 前言

目前国产化系统浪潮下,适配鸿蒙是中国软件大势所趋,.NET作为最适合开发客户端语言之一,适配鸿蒙系统(HarmonyOS Next)是目前.NET开发者最关心的事情。我目前业余时间正在移植Avalonia到HarmonyOS,去年在.NET Conf CN上分享过,目前又取得一点进展,所以本文把所有问题进行整合与大家进行分享。

2301_76476890的博客 1461

Spring Boot + Vue3 实战:构建AI全栈旅游推荐应用

全栈开发是现代Web应用构建的核心模式,它要求开发者同时掌握前端交互与后端业务逻辑。其原理在于通过清晰的接口(如RESTful API)实现前后端分离,使数据在用户界面、服务器和外部服务间高效流转。这种架构的价值在于提升了开发效率、系统可维护性和团队协作能力,广泛应用于电商、社交、内容平台等各类互联网产品。随着人工智能技术的普及,将大语言模型(LLM)等AI能力集成到传统Web应用中,构建智能化的“AI全栈”应用,已成为提升产品竞争力的新趋势。本文以Spring Boot和Vue3为核心技术栈,通过一个旅游

axfcjwkbi259888707的博客 419

手把手教你用STM32实现SPWM逆变器控制(附完整代码)

本文提供了一份基于STM32实现SPWM逆变器控制的完整实战指南。文章从硬件选型(如STM32F103C8T6、IR2104驱动器)入手,详细解析了利用定时器TIM1生成SPWM波形的核心原理与代码实现,并涵盖了驱动电路、全桥功率电路及LC滤波器的设计要点与调试技巧,旨在帮助读者从零构建一个可靠的单相全桥逆变器系统。

weixin_29208327的博客 592

从‘端口被占’到丝滑启动:给你的Spring Boot/Tomcat/Node.js项目配置动态端口和优雅关闭

本文详细介绍了如何为Spring Boot、Tomcat和Node.js项目配置动态端口和实现优雅关闭,解决端口占用问题。通过工程化实践,开发者可以避免常见的端口冲突,提升开发效率和团队协作体验。文章还提供了多种技术栈的解决方案和工具推荐,帮助开发者构建更健壮的开发环境。

天天开心 530

S32DS使用完整指南:S32K CAN通信模块配置步骤

深入讲解S32DS使用过程中S32K芯片的CAN通信模块配置步骤,涵盖关键设置与常见问题。掌握s32ds使用技巧,提升开发效率,实现稳定可靠的车载网络通信。

weixin_42592399的博客 982

Authentication Assertion Tickets,SAP 系统到系统单点登录里的短命凭证

SAP 系统间的身份传递机制存在 Authentication Assertion Ticket 和 SAP Logon Ticket 两种易混淆的凭证。前者用于系统间短时身份委托(有效期2分钟,通过HTTP头传输),后者用于浏览器SSO(可配置有效期,通过Cookie传输)。Assertion Ticket依赖签发系统的数字签名和严格的时间同步,适用于ABAP/Java系统间的后台作业调用。现代SAP架构已转向OAuth 2.0等标准协议,但老系统中仍需注意两种票据的关键差异:传输方式、有效期、接收方限制

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 602

DeepAudit实战:如何用它的多智能体架构,为你的Spring Boot/Go项目定制专属安全防线

本文详细介绍了如何利用DeepAudit的多智能体架构为Spring Boot/Go项目构建精准安全防线。通过智能体分工优化、框架级漏洞规则增强、提示词模板调优等方法,DeepAudit能够高效识别复杂业务逻辑漏洞,提升安全审计效率。文章还提供了CI/CD集成和性能优化实践,助力企业打造更安全的开发流水线。

weixin_29281915的博客 401

rk3576 适配以太网(百兆)

百兆以太网,也常被称为快速以太网,是一种在1990年代中期推出的计算机网络技术标准。它相当于把当时主流的10兆以太网速度提升了10倍,最高能提供 100 Mbps 的传输速率,让文件共享、视频传输等网络应用变得流畅许多。它在数据链路层面完全保留了传统以太网的帧格式和MAC机制,这意味着现有的网络软件可以无缝对接,用户从10兆网络升级到百兆网络时,通常只需要更换网卡和集线器/交换机即可,非常方便。 在rk3576平台上,原生以太网接口支持百兆、千兆,还有pcie转换的2.5G。

weixin_35723192的博客 204
上一篇: 高并发下接口耗时狂飙?这3个高可用设计让QPS从500冲到5000
下一篇: 我在秒杀系统上踩过的3个大坑,设计时千万注意
Java开发廖志伟
博客等级 码龄2年 3491粉丝 1534原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值