知識庫 / Spring / Spring Boot RSS 訂閱

使用 Spring Boot 進行 CI/CD 實踐

DevOps,Spring Boot
HongKong
6
12:56 PM · Dec 06 ,2025

1. 概述

本教程將介紹持續集成/持續部署 (CI/CD) 流程,並實施其核心部分。

我們將創建一個簡單的 Spring Boot 應用程序,然後將其推送到共享的 Git 倉庫。之後,我們將使用構建集成服務對其進行構建,創建一個 Docker 鏡像,並將其推送到 Docker 倉庫。

最終,我們將自動將我們的應用程序部署到 PaaS 服務(Heroku)上。

2. 版本控制

版本控制是 CI/CD 流程的關鍵部分,用於管理我們的代碼。此外,我們需要一個託管服務,以便我們的構建和部署步驟與之集成。

我們選擇 Git 作為版本控制系統 (VCS),以及 GitHub 作為託管服務,因為它們目前最受歡迎,並且可以免費使用。

首先,我們需要在 GitHub 上創建一個賬户

此外,我們應該創建一個 Git 倉庫 。我們將其命名為 baeldung-ci-cd-process。 此外,我們選擇公共倉庫,這樣就可以免費訪問其他服務。 最後,讓我們使用 README.md 初始化我們的倉庫。

現在我們的倉庫已經創建好,我們應該將項目克隆到本地。為此,請在我們的本地計算機上執行以下命令:

git clone https://github.com/$USERNAME/baeldung-ci-cd-process.git

這將初始化我們的項目,位於我們執行命令的目錄下。目前,它應該只包含 README.md 文件。

3. 創建應用程序

本節將創建一個簡單的 Spring Boot 應用程序,參與流程。我們還將使用 Maven 作為構建工具。

首先,讓我們在包含我們克隆的版本控制倉庫的目錄中初始化項目。

例如,我們可以使用 Spring Initializer,添加 web 模塊actuator 模塊

3.1. 手動創建應用程序

或者,我們可以手動添加 spring-boot-starter-webspring-boot-starter-actuator 依賴項:

<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>

首先介紹 REST 端點,其次介紹健康檢查端點。

此外,讓我們添加插件,以便運行我們的應用程序:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<p>最後,讓我們添加一個 Spring Boot 主類:</p>
@SpringBootApplication
public class CiCdApplication {

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

3.2. 推送 (Pushing)

無論您使用 Spring Initializr 還是手動創建項目,我們現在已準備好將更改提交併推送到我們的倉庫。

請使用以下命令執行:

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

我們現在可以檢查我們的更改是否已存在於存儲庫中。

4. 構建自動化

構建過程中的另一個環節是用於構建和測試我們推送的代碼的服務。

我們將使用 Travis CI,但任何構建服務均可使用。

4.1. Maven Wrapper

讓我們先為我們的應用程序添加一個 Maven Wrapper。 如果我們使用了 Spring Initializr,則可以跳過這一步,因為它默認包含在內。

在應用程序目錄下,請執行以下操作:

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

這將添加 Maven 包裝器文件,包括 mvnwmvnw.cmd 文件,這些文件可以替代 Maven 使用。

Travis CI 本身就自帶 Maven,但其他構建服務可能沒有。這個 Maven 包裝器將幫助我們應對兩種情況。開發者也不需要為自己的機器安裝 Maven。

4.2. 構建服務

隨後,我們通過 登錄 Travis CI 賬户。 以後,我們應該允許項目在 GitHub 中訪問。

接下來,我們應該創建一個 .travis.yml 文件,該文件將描述 Travis CI 中的構建過程。 大多數構建服務都允許我們創建這樣的文件,該文件位於我們倉庫的根目錄。

在我們的例子中,我們讓 Travis 使用 Java 11 和 Maven Wrapper 構建我們的應用程序:

language: java
jdk:
  - openjdk11
script:
  - ./mvnw clean install

語言屬性指示我們希望使用 Java。

JDK屬性指定從 Docker Hub 下載的 Docker 鏡像,這裏是 openjdk11

腳本屬性指定要運行的命令——我們希望使用 Maven 包裝器。

最後,我們應該將更改推送到存儲庫。Travis CI 應該自動觸發構建。

5. 容器化 (Dockerizing)

在本節中,我們將使用我們的應用程序構建一個 Docker 鏡像,並在 DockerHub 上託管該鏡像,作為持續交付 (CD) 流程的一部分。 這將允許我們在任何機器上輕鬆運行它。

5.1. Docker 鏡像倉庫

首先,我們需要為我們的鏡像創建一個 Docker 倉庫。

讓我們在 DockerHub 上創建一個賬户。 此外,讓我們通過填寫適當的字段創建用於我們項目的倉庫:

  • 名稱:baeldung-ci-cd-process
  • 可見性:公開
  • 構建設置:GitHub

5.2. Docker 鏡像

現在,我們準備創建 Docker 鏡像並將其推送到 Docker Hub。

首先,讓我們添加 jib-maven-plugin,它將創建並推送我們的鏡像以及應用程序到 Docker 倉庫(請將 <em>DockerHubUsername</em> 替換為正確的用户名):

<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>${DockerHubUsername}/baeldung-ci-cd-process</image>
                        <tags>
                            <tag>${project.version}</tag>
                            <tag>latest</tag>
                        </tags>
                    </to>
                </configuration>
            </plugin>
        </plugins>
    </build>
</profile>

我們將其作為 Maven 配置文件的一部分添加,以避免在默認構建中觸發它。

此外,我們還指定了兩個標籤用於圖像。要了解更多關於插件的信息,請訪問我們關於 Jib 的文章。

從現在開始,讓我們調整我們的構建文件 ()

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

通過這些更改,構建服務將在構建應用程序之前登錄到 DockerHub。此外,它還將執行帶有我們配置文件的 deploy 階段。在那個階段,我們的應用程序將被推送到 Docker 倉庫中的鏡像。

最後,我們應該在構建服務中定義 DOCKER_PASSWORDDOCKER_USERNAME 變量。在 Travis CI 中,這些變量可以作為構建設置的一部分進行定義 進行定義

現在,讓我們將更改推送到 VCS。構建服務應自動觸發帶有我們更改的構建。

我們可以通過在本地運行來檢查 Docker 鏡像是否已推送到存儲庫:

docker run -p 8080:8080 -t $DOCKER_USERNAME/baeldung-ci-cd-process

現在,我們應該能夠通過訪問 http://localhost:8080/actuator/health 來訪問我們的健康檢查。

6. 代碼分析

接下來,我們將包含在我們的 CI/CD 流程中是靜態代碼分析。這種流程的主要目標是確保代碼質量最高。例如,它可以檢測到我們缺少足夠的測試用例,或者存在安全問題。

讓我們與 CodeCov 集成,它將告知我們測試覆蓋率。

首先,我們應該使用我們的 GitHub 個人資料登錄 CodeCov 以建立集成。

其次,我們應該對我們的代碼進行更改。我們先添加 jacoco 插件

<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>

該插件負責生成用於 CodeCov 使用的測試報告。

接下來,我們應該調整構建服務文件中腳本部分(.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)

我們指示 JacoCo 插件在 cleaninstall 階段觸發。此外,我們還包含了 after_success 部分,該部分會在構建成功後將報告發送到 CodeCov。

未來,我們應該為我們的應用程序添加一個測試類。例如,它可以是主類的測試:

@SpringBootTest
class CiCdApplicationIntegrationTest {

    @Test
    public void contextLoads() {

    }
}

最後,我們應該提交我們的更改。構建過程應啓動,並在與倉庫相關的 CodeCov 配置文件中生成報告。

7. 部署應用程序

作為我們流程的最後一部分,我們將部署我們的應用程序。 擁有可供使用的 Docker 鏡像後,我們可以將其部署到任何服務上。 例如,我們可以將其部署到基於雲的 PaaS 或 IaaS。

讓我們將應用程序部署到 Heroku,這是一個需要最小配置的 PaaS。

首先,我們應該 創建賬户,然後 登錄

接下來,讓我們在 Heroku 中 創建應用程序空間,並將其命名為 baeldung-ci-cd-process。應用程序的名稱必須是唯一的,因此我們可能需要使用另一個名稱。

我們將通過 將 Heroku 與 GitHub 集成 進行部署,因為它是一種最簡單的解決方案。 但是,我們也可以編寫一個使用我們 Docker 鏡像的流水線。

展望未來,我們應該在我們的 pom 中包含 heroku 插件

<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>spring-boot-ci-cd</appName>
                    <processTypes>
                        <web>java $JAVA_OPTS -jar -Dserver.port=$PORT target/${project.build.finalName}.jar</web>
                    </processTypes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</profile>

類似於 Docker,我們將其作為 Maven 配置文件的一部分添加進來。此外,我們還包含了在 web 部分的啓動命令。

接下來,我們應該調整我們的構建服務文件 (.travis.yml),以便將其部署到 Heroku 上:

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

此外,讓我們在構建服務中將 Heroku API-KEY 添加到 HEROKU_API_KEY 變量中。

最後,讓我們提交我們的更改。構建完成後,應用程序應部署到 Heroku。

我們可以通過訪問 https://baeldung-ci-cd-process.herokuapp.com/actuator/health 進行檢查。

8. 結論

在本文中,我們學習了 CI/CD 流程的關鍵組成部分以及如何準備它們。

首先,我們創建了一個 Git 倉庫並在 GitHub 上推送到其中。然後,我們使用 Travis CI 作為構建工具從該倉庫構建我們的應用程序。

之後,我們創建了一個 Docker 鏡像並將其推送到 DockerHub。

接下來,我們添加了一個負責靜態代碼分析的服務。

最後,我們將應用程序部署到 PaaS 並訪問它。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.