欢迎阅读我的文章!更多精彩内容,欢迎关注:
• B站主页:🫱小枫Geek
• 微信公众号:Procode
前言
在现代软件开发中,持续集成(CI)与持续交付/部署(CD) 已经成为团队交付高质量应用的核心能力。对于 Java 开发者而言,Spring Boot 项目往往是后端的主体服务,而如何将其与 Maven 构建、Docker 容器化 以及 GitHub Actions 自动化流程 有机结合,是每一个团队都需要认真考虑的问题。
本文将通过实战经验,分享 Spring Boot 在 CI/CD 流水线中的最佳实践,从构建到发布,带你完整走一遍落地流程。
一、为什么要给 Spring Boot 配置 CI/CD 流水线?
在传统开发模式中,部署 Spring Boot 项目通常有几个问题:
-
手动构建成本高:每次更新都要本地打包、上传服务器,效率低。
-
环境不一致:本地运行正常,上线后因 JDK/依赖版本不同导致异常。
-
可追踪性差:没有明确的版本与构建记录,出现问题难以回溯。
-
运维复杂:缺乏自动化的测试与部署,容易引入人为失误。
CI/CD 流水线的核心目标就是解决这些问题,让构建、测试、打包、部署 全自动化。
二、Spring Boot 项目的 CI/CD 总体架构
Spring Boot 的 CI/CD 一般包含以下几个步骤:
-
代码提交 → GitHub/GitLab
-
自动触发 CI → Maven 构建 & 单元测试
-
构建 Docker 镜像 → 上传到镜像仓库(Docker Hub/阿里云/Harbor)
-
部署 CD → 部署到服务器/Kubernetes 集群
流程图如下:

三、Maven 构建最佳实践
Spring Boot 默认使用 Maven 作为构建工具,但要适配 CI/CD,需要注意一些最佳实践:
1. 使用 Profile 区分环境
在 pom.xml 中定义不同环境:
<profiles>
<profile>
<id>dev</id>
<properties>
<activatedProperties>dev</activatedProperties>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<activatedProperties>prod</activatedProperties>
</properties>
</profile>
</profiles>
构建时区分环境:
mvn clean package -Pprod -DskipTests
2. 合理使用插件
-
Spring Boot 插件:简化可执行 jar 构建
-
Dockerfile Maven Plugin 或 Jib:无 Docker 环境也能构建镜像
-
Surefire & Failsafe 插件:保证单元测试与集成测试在流水线执行
四、Docker 容器化最佳实践
1. Dockerfile 编写
推荐多阶段构建,避免镜像过大:
# 第一阶段:构建
FROM maven:3.9.6-eclipse-temurin-21 AS build
WORKDIR /app
COPY . .
RUN mvn clean package -DskipTests
# 第二阶段:运行
FROM eclipse-temurin:21-jre
WORKDIR /app
COPY --from=build /app/target/app.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
2. 镜像优化建议
-
使用
eclipse-temurin:21-jre-alpine轻量化镜像 -
利用 Spring Boot Layered JAR 分层缓存
-
定义健康检查,保证容器状态可控:
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost:8080/actuator/health || exit 1
五、GitHub Actions 实战
1. 基本 Workflow
在项目根目录 .github/workflows/ci.yml 添加:
name: CI/CD for Spring Boot
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up JDK 21
uses: actions/setup-java@v3
with:
java-version: '21'
distribution: 'temurin'
- name: Build with Maven
run: mvn clean package -DskipTests
- name: Build Docker image
run: docker build -t myapp:latest .
- name: Push to Docker Hub
run: |
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
docker tag myapp:latest myrepo/myapp:latest
docker push myrepo/myapp:latest
2. 部署到服务器
如果是传统服务器,可通过 SSH 部署:
- name: Deploy to Server
uses: appleboy/ssh-action@v0.1.10
with:
host: ${{ secrets.SERVER_IP }}
username: ${{ secrets.SERVER_USER }}
password: ${{ secrets.SERVER_PASS }}
script: |
docker pull myrepo/myapp:latest
docker stop myapp || true
docker rm myapp || true
docker run -d -p 8080:8080 --name myapp myrepo/myapp:latest
3. 部署到 Kubernetes
如果是 K8s 集群:
- name: Set up kubectl
uses: azure/setup-kubectl@v3
with:
version: 'latest'
- name: Deploy to Kubernetes
run: |
kubectl set image deployment/myapp myapp=myrepo/myapp:latest
六、常见问题与解决方案
-
Maven 构建时间长→ 使用缓存:
actions/cache@v3缓存 Maven 依赖。 -
Docker 镜像过大→ 使用多阶段构建 + JRE 轻量镜像。
-
GitHub Actions Secrets 泄漏风险→ 使用 GitHub Secrets 管理账号密码,禁止写死在配置文件。
-
灰度发布需求→ 在 Kubernetes 上结合 Ingress + Canary Deployment 或 Argo Rollouts 实现。
七、最佳实践总结
-
Maven 构建:Profile 区分环境,测试自动化,插件使用合理。
-
Docker 化:镜像分层优化,健康检查必配,尽量无状态化。
-
GitHub Actions:构建、推送、部署全流程自动化,Secrets 保证安全。
-
运维思维:监控、日志、告警体系要同步规划,不能只停留在部署。
结语
CI/CD 并不仅仅是自动化工具链,而是 一种工程文化。对于 Spring Boot 项目来说,Maven + Docker + GitHub Actions 这一套组合几乎可以覆盖从构建到部署的全链路需求。如果你还在手动打包上传,那么正是时候把 CI/CD 流水线纳入团队开发流程。
未来,你还可以进一步结合 Kubernetes、Helm、ArgoCD 等工具,打造真正的云原生 DevOps 流程。
528

被折叠的 条评论
为什么被折叠?



