1. 概述

本文将带你一步步搭建一个完整的 CI/CD(持续集成 / 持续部署)流程,适用于 Spring Boot 项目。整个过程包括:

✅ 代码托管(GitHub)
✅ 自动构建与测试(Travis CI)
✅ 镜像构建与推送(Docker + Jib)
✅ 代码质量分析(CodeCov)
✅ 自动部署到 PaaS 平台(Heroku)

目标是:代码一提交,自动走完构建、测试、打包、部署全流程,真正做到“一键上线”。

我们不会堆砌概念,而是直接动手实现。踩过的坑也会顺带提一嘴,避免你重复掉进去。


2. 版本控制

CI/CD 的前提是代码托管。我们选择目前最主流的组合:Git + GitHub

2.1 创建仓库

  1. 注册 GitHub 账号(https://github.com/join
  2. 创建新仓库,命名为 baeldung-ci-cd-process
  3. 勾选“Initialize with README”,创建一个公开仓库(Public),方便免费接入其他服务

2.2 克隆到本地

执行以下命令:

git clone https://github.com/your-github-username/baeldung-ci-cd-process.git

此时本地目录下只有一个 README.md,接下来我们往里面加 Spring Boot 项目。


3. 创建 Spring Boot 应用

使用 Maven 作为构建工具,创建一个极简的 Web 服务。

3.1 手动添加依赖

如果你不用 Spring Initializr,可以手动在 pom.xml 中加入:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  • spring-boot-starter-web:提供 REST 接口能力
  • spring-boot-starter-actuator:暴露 /actuator/health 健康检查接口,方便后续验证部署是否成功

再添加 Spring Boot 构建插件:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

主类代码:

@SpringBootApplication
public class CiCdApplication {

    public static void main(String[] args) {
        SpringApplication.run(CiCdApplication.class, args);
    }
}

3.2 提交代码

git add .
git commit -m 'Initialize application'
git push

推上去之后,GitHub 仓库里就能看到项目结构了。


4. 构建自动化(Travis CI)

接下来接入 Travis CI,实现“代码一提交,自动构建”。

4.1 添加 Maven Wrapper

虽然 Spring Initializr 默认带了 mvnw,但为了确保 CI 环境一致性,建议显式添加 Maven Wrapper:

mvn -N io.takari:maven:0.7.7:wrapper

这会生成 mvnwmvnw.cmd,以后 CI 脚本都用 ./mvnw 代替 mvn,避免版本不一致问题。

4.2 配置 Travis CI

  1. 访问 https://travis-ci.com 并用 GitHub 登录
  2. 启用你刚创建的仓库权限
  3. 在项目根目录创建 .travis.yml
language: java
jdk:
  - openjdk11
script:
  - ./mvnw clean install

说明:

  • language: java:声明使用 Java 环境
  • jdk: openjdk11:使用 OpenJDK 11
  • script:构建脚本,执行 Maven 构建

提交后,Travis 会自动触发构建。✅ 绿色表示成功,❌ 红色说明有测试失败或编译错误。


5. 容器化(Docker + Jib)

接下来把应用打包成 Docker 镜像,推送到 DockerHub。

5.1 创建 DockerHub 仓库

  1. 注册 DockerHub
  2. 创建仓库 baeldung-ci-cd-process,设为 Public
  3. 可选:配置 GitHub 自动构建(但我们用 Jib 手动推)

5.2 使用 Jib 插件构建镜像

Jib 是 Google 出的神器,无需本地安装 Docker,直接通过 Maven 构建并推送到远程仓库。

pom.xml 中添加 profile:

<profile>
    <id>deploy-docker</id>
    <properties>
        <maven.deploy.skip>true</maven.deploy.skip>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
                <version>2.2.0</version>
                <configuration>
                    <to>
                        <image>your-dockerhub-username/baeldung-ci-cd-process</image>
                        <tags>
                            <tag>${project.version}</tag>
                            <tag>latest</tag>
                        </tags>
                    </to>
                </configuration>
            </plugin>
        </plugins>
    </build>
</profile>

⚠️ 注意:your-dockerhub-username 替换为你的真实 DockerHub 用户名。

5.3 修改 Travis 构建脚本

更新 .travis.yml

before_install:
  - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
  - docker pull openjdk:11-jre-slim-sid

script:
  - ./mvnw clean install
  - ./mvnw deploy jib:build -P deploy-docker

并在 Travis 的 Environment Variables 中设置:

  • DOCKER_USERNAME:你的 DockerHub 用户名
  • DOCKER_PASSWORD:你的 DockerHub 密码(建议用 Access Token 更安全)

这样构建时会自动登录并推送镜像。

5.4 本地验证

构建成功后,可以本地拉镜像测试:

docker run -p 8080:8080 -t your-dockerhub-username/baeldung-ci-cd-process

访问 http://localhost:8080/actuator/health,返回 {"status":"UP"} 就 OK 了。


6. 代码质量分析(CodeCov)

接入 CodeCov,监控单元测试覆盖率,防止“无脑提交”。

6.1 集成 CodeCov

  1. 访问 https://codecov.io 并用 GitHub 登录
  2. 授权并启用你的项目

6.2 添加 JaCoCo 插件

pom.xml 中加入:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.11</version>
    <executions>
        <execution>
            <id>default-prepare-agent</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>report</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>

6.3 修改 Travis 脚本

更新 .travis.yml

script:
  - ./mvnw clean org.jacoco:jacoco-maven-plugin:prepare-agent install
  - ./mvnw deploy jib:build -P deploy-docker

after_success:
  - bash <(curl -s https://codecov.io/bash)

after_success 表示构建成功后上传覆盖率报告。

6.4 添加测试类

哪怕只有一个空测试,也得有:

@SpringBootTest
class CiCdApplicationIntegrationTest {

    @Test
    public void contextLoads() {
    }
}

推上去后,CodeCov 会自动生成报告,还能在 PR 中评论覆盖率变化。


7. 自动部署到 Heroku

最后一步:自动部署到 Heroku,实现“提交即上线”。

7.1 创建 Heroku 应用

  1. 注册 Heroku
  2. 创建应用,命名为 baeldung-ci-cd-process(需全局唯一)

7.2 添加 Heroku Maven 插件

pom.xml 中添加 profile:

<profile>
    <id>deploy-heroku</id>
    <properties>
        <maven.deploy.skip>true</maven.deploy.skip>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>com.heroku.sdk</groupId>
                <artifactId>heroku-maven-plugin</artifactId>
                <version>3.0.2</version>
                <configuration>
                    <appName>baeldung-ci-cd-process</appName>
                    <processTypes>
                        <web>java $JAVA_OPTS -jar -Dserver.port=$PORT target/${project.build.finalName}.jar</web>
                    </processTypes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</profile>

⚠️ 注意:<appName> 填你在 Heroku 创建的应用名。

7.3 配置 Travis 部署

在 Travis 中添加环境变量:

修改 .travis.yml

script:
  - ./mvnw clean install
  - ./mvnw heroku:deploy jib:build -P deploy-heroku,deploy-docker

这样构建完成后,会同时推送到 DockerHub 和部署到 Heroku。

7.4 验证部署

部署成功后,访问:

https://baeldung-ci-cd-process.herokuapp.com/actuator/health

返回 {"status":"UP"},说明服务已正常运行。


8. 总结

我们完整走了一遍 Spring Boot 项目的 CI/CD 流程:

  1. ✅ GitHub 托管代码
  2. ✅ Travis CI 自动构建
  3. ✅ Jib 构建 Docker 镜像并推送到 DockerHub
  4. ✅ CodeCov 监控测试覆盖率
  5. ✅ Heroku 自动部署,支持公网访问

整个流程无需手动操作,真正实现“提交即部署”。

项目源码已托管至 GitHub:https://github.com/your-username/baeldung-ci-cd-process(请替换为你的实际地址)

这套方案简单粗暴,适合中小型项目快速上线。如果团队规模扩大,可以逐步迁移到 Jenkins、GitLab CI 或 GitHub Actions 等更复杂的平台。


原始标题:Applying CI/CD With Spring Boot