Spring Boot 在 CI/CD 流水线中的最佳实践:Maven、Docker 与 GitHub Actions

  欢迎阅读我的文章!更多精彩内容,欢迎关注:
• 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 一般包含以下几个步骤:

  1. 代码提交 → GitHub/GitLab

  2. 自动触发 CI → Maven 构建 & 单元测试

  3. 构建 Docker 镜像 → 上传到镜像仓库(Docker Hub/阿里云/Harbor)

  4. 部署 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

六、常见问题与解决方案

  1. Maven 构建时间长→ 使用缓存:actions/cache@v3 缓存 Maven 依赖。

  2. Docker 镜像过大→ 使用多阶段构建 + JRE 轻量镜像。

  3. GitHub Actions Secrets 泄漏风险→ 使用 GitHub Secrets 管理账号密码,禁止写死在配置文件。

  4. 灰度发布需求→ 在 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 流程。


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小枫Geek

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值