post-image

Áp dụng CI/CD với Spring Boot

Deployment & CI/CD Testing Tổng quan

1. Overview

Trong hướng dẫn này, chúng ta sẽ xem xét quy trình Continuous Integration/Continuous Deployment (CI / CD) và triển khai các phần thiết yếu của nó.

Chúng tôi sẽ tạo một ứng dụng Spring Boot đơn giản và sau đó đẩy nó vào kho lưu trữ Git repository. Sau đó, chúng tôi sẽ xây dựng nó bằng building integration service, tạo Docker image và đẩy nó vào Docker repository.

Cuối cùng, chúng tôi sẽ tự động triển khai ứng dụng của mình cho dịch vụ PaaS (Heroku).

2. Version Control.

Phần quan trọng của CI / CD là hệ thống kiểm soát phiên bản để quản lý mã. Ngoài ra, chúng tôi cần một repository hosting service mà các bước xây dựng và triển khai của chúng tôi sẽ gắn liền với nó.

Hãy chọn GIT làm VCS và GItHub làm repository vì chúng phổ biến nhất tại thời điểm này và được miễn phí sử dụng.

Đầu tiên, chúng ta tạo tài khoản trên GitHub.

Ngoài ra chúng ta cần tạo 1 Git repository. Hãy đặt tên nó là baeldung-ci-cd-process. Ngoài ra hãy public repository vì nó sẽ cho phép chúng ta tru cập các dịch vụ miễn phí. Cuối cùng, hãy khởi tạo kho lưu trữ của chúng ta bằng README.md.

Bây giờ repository đã được tạo, hãy clone dự án về máy tính của bạn. Sử dụng câu lệnh sau:

git clone https://github.com/$USERNAME/baeldung-ci-cd-process.gitCode language: PHP (php)

Thao tác này sẽ khởi tạo dự án trong thư mục mà bạn đã thực thi lệnh. Hiện tại, nó chỉ chứa tệp README.md.

3. Creating the Application.

Trong phần này, chúng ta sẽ tạo 1 ứng dụng Spring Boot đơn giản để tham gia quád trình này. Chúng ta dùng Maven làm công cụ xây dựng.

Đầu tiên, hãy khởi tạo dự án trong thư mục nơi mà bạn đã clone repository ở trên.

Ví dụ, chúng ta có thể làm điều này với Spring Initializer, thêm các module cần thiết vào.

3.1 Tạo ứng dụng thủ công

Hoặc chúng ta có thể thêm các dependency thủ công spring-boot-starter-web và spring-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>Code language: HTML, XML (xml)

Đầu tiên kiểm tra điểm cuối REST và điểm thứ 2, kiểm tra tình trạng điểm cuối.

Thêm plugin cho phép chúng ta chạy ứng dụng:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>Code language: HTML, XML (xml)

Và cuối cùng, hãy thêm một hàm main Spring Boot:

@SpringBootApplication
public class CiCdApplication {

    public static void main(String[] args) {
        SpringApplication.run(CiCdApplication.class, args);
    }
}Code language: PHP (php)

3.2. Pushing

Cho dù sử dụng Spring Initializr hay tạo dự án theo cách thủ công, chúng ta hãy commit và push những thay đổi lên repository.

git add .
git commit -m 'Initialize application'
git pushCode language: JavaScript (javascript)

4. Build Automation

Một phần khác của quy trình CI/CD là 1 dịch vụ xây dựng và kiểm tra push code.

Chúng tôi sẽ sử dụng Travis CI ở đây, nhưng bất kỳ dịch vụ xây dựng nào cũng sẽ hoạt động.

4.1. Maven Wrapper

Hãy bắt đầu bằng cách thêm Maven Wrapper vào ứng dụng. Nếu chúng ta đã sử dụng Spring Initializr, chúng ta có thể bỏ qua phần này vì nó được bao gồm theo mặc định.

Trong thư mục ứng dụng, hãy thực hiện:

mvn -N io.takari:maven:0.7.7:wrapperCode language: CSS (css)

Thao tác này sẽ thêm các tệp trình bao bọc Maven, bao gồm các file mvnw và mvnw.cmd có thể được sử dụng thay cho Maven.

Trong khi Travis CI có Maven của riêng mình, các dịch vụ xây dựng khác có thể không. Maven Wrapper này sẽ giúp chúng ta chuẩn bị cho một trong hai tình huống. Ngoài ra, các nhà phát triển sẽ không phải cài đặt Maven trên máy của họ.

4.2. Building Service

Sau đó, hãy tạo tài khoản trên Travis CI bằng cách signing in bằng tài khoản GitHub. Trong tương lai, chúng tôi sẽ cho phép truy cập vào dự án của mình trong GitHub.

Tiếp theo, chúng ta nên tạo một tệp .travis.yml sẽ mô tả quá trình xây dựng trong Travis CI. Hầu hết các dịch vụ xây dựng cho phép chúng tôi tạo một tệp như vậy, tệp này nằm ở gốc của kho lưu trữ.

Trong trường hợp đã nói, hãy yêu cầu Travis sử dụng Java 11 và Maven Wrapper để xây dựng ứng dụng:

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

Thuộc tính language cho biết chúng ta sử dụng Java.

Thuộc tính jdk cho biết Docker image nào cần tải xuống từ DockerHub, opẹndk11.

Thuộc tính script cho biết câu lệnh để chạy ứng dụng.

Cuối cùng, chúng ta nên đẩy các thay đổi của mình vào repository. Travis CI sẽ tự động kích hoạt build.

5. Dockerizing

Trong phần này, chúng ta sẽ xây dựng Docker image bằng ứng dụng và lưu trữ nó trên DockerHub. Nó sẽ cho phép chúng ta chạy nó trên máy 1 cách dễ dàng.

5.1. Repository for Docker Images

Đầu tiên chúng ta cần tạo 1 Docker repository cho các images.

Hãy tạo một tài khoản trên DockerHub. Ngoài ra, hãy tạo repository cho dự án bằng cách điền vào các trường thích hợp:

  • name: baeldung-ci-cd-process
  • visibility: Public
  • Build setting: GitHub

5.2. Docker Image

Bây giờ, chúng ta đã sẵn sàng tạo Docker image và đẩy nó lên DockerHub.

Đầu tiên chúng ta hãy thêm the jib-maven-plugin và push vào image cùng với ứng dụng vào Docker repository(thay DockerHubUsername bằng tên người dùng chính xác):

<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>Code language: HTML, XML (xml)

Chúng ta thêm nó như một phần của Maven profile để không kích hoạt nó với bản build mặc định.

Ngoài ra, chúng ta chỉ định hai thẻ cho image. Để tìm hiểu thêm về plugin, hãy truy cập bài viết của chúng tôi về Jib. Về sau, hãy điều file build(.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-dockerCode language: PHP (php)

Với những thay đổi này, dịch vụ sẽ đăng nhập vào DockerHub trước khi xây dụng ứng dụng. Ngoài ra sẽ thực hiện giai đoạn triển khai vào profile của chúng ta. Trong giai đoạn đó, ứng dụng của chúng ta sẽ được push dưới dạng 1 image vào Docker repository.

Cuối cùng, chúng ta nên xác định các biến DOCKER_PASSWORD và DOCKER_USERNAME trong build service. Trong Travis CI, những biến này có thể được xác định như 1 phần của build settings.

Bây giờ, chúng ta hãy push những thay đổi lên VCS. Build service sẽ tự động kích oạt với các thay đổi trên. Chúng ta có thể kiểm tra Docker image được được push lên repository chưa bằng cách chạy câu lệnh:

docker run -p 8080:8080 -t $DOCKER_USERNAME/baeldung-ci-cd-processCode language: PHP (php)

Bây giờ, chsung ta có thể truy cập http://localhost:8080/actuator/health để kiểm tra.

6. Code Analysis

Điều tiếp theo mà chúng tôi sẽ đưa vào quy trình CI/CD là code analysis. Mục tiêu chính của quá trình như vậy là đảm bảo chất lượng của code. Ví dụ: nó có thể phát hiện ra rằng chúng tôi không có đủ trường hợp thử nghiệm hoặc chúng tôi có 1 số vấn đề bảo mật.

Hãy tích hợp với CodeCov, nó sẽ thông báo cho chúng ta về phạm vi sử dụng.

Đầu tiên, chúng ta nên đăng nhập vào CodeCov bằng GitHub để thiết lập tích hợp.

Thứ hai, chúng ta chay đổi code bằng cách thêm jacoco plugin:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.5</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>Code language: HTML, XML (xml)

Plugin chịu trách nhiệm tạo các báo cáo thử nghiệm sẽ được CodeCov sử dụng.

Tiếp theo, chúng ta nên điều chỉnh phần script trong file build service(.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)Code language: JavaScript (javascript)

Chúng tôi đã hướng dẫ jacoco plugin kích hoạt trong gia đoạn install. Ngoài ra chúng tôi đã bao gồm phần after_success, phần này sẽ gửi báo cáo đến CodeCov sau khi build thành công.

Trong tương lai, chúng tôi nên thêm 1 class thử nghiệp vào ứng dụng của mình. Ví dụ nó có thể là 1 bài test cho class:

@SpringBootTest
class CiCdApplicationIntegrationTest {

    @Test
    public void contextLoads() {

    }
}Code language: CSS (css)

Cuối cùng, chúng ta push nhưng thay đổi lên repository. Quá trình build phải được kích hoạt và báo cáo phải được tạo trong CodeCov liên quan đến repository.

7. Deploying the Application

Là phần cuối cùng của quy trình, chúng tôi sẽ deploy application. Cùng với Docker image có sẵn để sử dụng, chúng tôi có thể deploy nó lên bất kỳ service nào. Ví dụ: chúng tôi có thể deploy lên cloud-based PaaS hoặc laaS.

Cùng deploy application lên Heroku, đây là 1 PaaS yêu cầu thiết lập tối thiểu.

Đầu tiên chúng ta cần tạo tài khoản Heroku và đăng nhập.

Tiếp theo, hãy tạo the application space(không gian ứng dụng) trong Heroku và đặt tên là baeldung-ci-cd-process. Tên của ứng dụng phải là duy nhất, vì vậy chúng tôi có thể cần sử dụng một tên khác.

Chúng tôi sẽ deploy nó bằng cách tích hợp Heroku với GitHub, vì nó đơn giản nhất. Tuy nhiên, chúng tôi có thể đã viết đường dẫn sẽ sử dụng Docker image của chúng tôi.

Chúng tôi sẽ include heroku plugin trong pom:

<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>Code language: HTML, XML (xml)

Giống như Docker, chúng tôi đã thêm nó như 1 Maven profile. Ngoài ra, chúng tôi đã bao gồm các lệnh khưởi động trong phần web.

Tiếp theo, chúng ta nên điều chỉnh lại file build service(.travis.yml) để deploy application lên Heroku:

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

Ngoài ra, hãy thêm Heroku API-KEY trong biến HEROKU_API_KEY trong build service. Cuối cùng, hãy commit những thay đổi trên. Ứng dụng sẽ được deploy lên Heroku sau khi quá trình build kết thúc.
Chúng ta có thể kiểm tra bằng cách truy cập https://baeldung-ci-cd-process.herokuapp.com/actuator/health

8. Conclusion

Trong bài viết này, chúng ta đã tìm hiểu những phần thiết yếu của quy trình CI/CD là gì và cách chuẩn bị.

Đầu tiên, chúng tôi đã chuẩn bị 1 repository trên GitHub và push ứng dụng lên đó. Sau đó chúng tôi đã sử dụng Travis CI làm công cụ build để build ứng dụng vào repository.

Sau đó, chúng tôi tạo 1 Docker image và push lên DockerHub.

Tiếp theo, chúng tôi đã thêm 1 dịch vụ chịu trách nhiêm phân tích code.

Cuối cùng chúng tôi deploy application cho PaaS và truy cập nó.

Như mọi khi, code cho những ví dụ có trên GitHub.

Bài viết được tham khảo từ nguồn: https://www.baeldung.com/spring-boot-ci-cd

Bạn có thể tham khảo thêm:

https://hocspringboot.net/2020/10/20/deploy-springboot-tren-tomcat-voi-ubuntu-server/

https://hocspringboot.net/2020/09/21/spring-boot-ci-cd/

https://hocspringboot.net/2020/10/05/deploy-ung-dung-springboot-len-heroku/

Leave a Reply

Your email address will not be published. Required fields are marked *