Tạo CI/CD kết hợp Gitlab Runner và Docker Compose - Phần 1

Hôm nay mình sẽ làm một bài viết để giới thiệu về việc tạo CI/CD kết hợp Gitlab Runner và Docker Compose cho các bạn mới tìm hiểu

Trong bài này mình sẽ tạo CI/CD trên một project ngôn ngữ java 8 sử dụng framework Maven

Các khái niệm liên quan như CI, CD, Docker mình sẽ nêu ở cuối bài này.

Tạo file Dockerfile và docker-compose.yml cho project

Soạn nội dung cho file Dokerfile như sau:

FROM maven:3.6.0-jdk-8
 
ENV TZ=Asia/Ho_Chi_Minh
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
 
RUN mkdir -p /app
WORKDIR /app
 
COPY src/ ./src
COPY bin/ ./bin
RUN mvn install
 
CMD "./bin/run.sh"

Soạn nội dung cho file docker-compose.yml như sau:

version: "3"
services:
  user-activities-feed-kafka-subscriber:
    build:
      context: .
      dockerfile: Dockerfile
    image: registry.admicro.vn/lotus/user_activities_feed:${IMAGE_TAG}

Để chạy service trên chúng ta chạy lệnh:

$ docker-compose up

Khi build docker image các bạn sẽ thấy việc download thư viện rất mất thời gian để hạn chế việc này chúng ta sẽ cache lại các dependency để dùng lại trong các lần build tiếp theo (trong trường hợp chúng ta không thay đổi file pom.xml) bằng cách làm như sau:

Copy file pom vào thư mục WORKDIR. Sau đó chạy lênh để maven download toàn bộ dependency để cache lại cho các lần sau:

FROM maven:3.6.0-jdk-8
 
ENV TZ=Asia/Ho_Chi_Minh
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
 
RUN mkdir -p /app
WORKDIR /app
 
COPY pom.xml .
RUN mvn dependency:go-offline
 
COPY src/ ./src
COPY bin/ ./bin
RUN mvn install
 
CMD "./bin/run.sh"

Để dừng service vừa chạy chúng ta dùng lệnh:

$ docker-compose down

Khi deploy các service trong thực tế chúng ta có thể gặp phải hai vấn đề:

  • Chương cần phải đọc các configuration từ các file bên ngoài, các configuration này có thể thay đổi
  • Cần phải đọc các file logging của chương trình cho các mục đích debugging hoặc monitor

Để thực hiện được hai công việc này một cách dễ dàng chúng ta cần phải ghi các file này ở ngoài host và sau đó mount vào trong doker container. Docker cung cấp Module Volumes giúp chúng ta dễ dàng thực hiện công việc này.

version: "3"
services:
  user-activities-feed-kafka-subscriber:
    build:
      context: .
      dockerfile: Dockerfile
    image: registry.admicro.vn/lotus/user_activities_feed:${IMAGE_TAG}
    volumes:
      - ${RUN_DIR}/config:/app/config
      - ${RUN_DIR}/logs:/app/logs

Một số khái niệm cơ bản:

CI: Continuous Integration (tích hợp liên tục) là một khai niệm trong lĩnh vực software engineering. Trong thực tế nó ám chỉ việc các thành viên trong team khi thực hiện công việc của một project sẽ liên tục đẩy code của họ lên công cụ quản lý code như Git (ít nhất 1 ngày 1 lần) để tích hợp hợp lại với nhau. Code được đẩy lên sẽ được build và chạy qua các units test. Các lỗi phát sinh trong quá trình này sẽ được gưỉ đến team. Việc làm này giúp cho quá trình phát triển project giảm thiểu được các lỗi và giảm thời gian cho việc tích hợp

>> Sam Altman Người đứng sau siêu AI - ChatGPT

>> Chi 35.000 đồng để mua tài khoản ChatGPT

CD: Continuous Delivery (Chuyển giao liên tục) là một phương pháp được áp dụng trong các quy trình phát triển phần mềm với nhiều chu kỳ ngắn (short cycles).  CD thường được kết hợp với CI một cách hiệu quả. Sau khi mã code thay đổi được build và test thành công sẽ được tự động triển khai (deploy) trên môi trường devevlop hoặc product. Phương pháp này giúp giảm thiểu được thời gian và chi phí test và deploy trong quá trình phát triển phần mềm.

Như vậy ở phần này chúng ta đã nắm được cách tạo script để làm việc với docker, doker-compose và các khái niệm cơ bản về CI/CD. Ở phần tiếp theo mình sẽ giới thiệu về Jenkins Pipeline một công cụ hổ trợ đắc lực trong CI/CD.
Tham khảo phần tiếp theo ở đây nhé.

Fivestar: 
Average: 5 (1 vote)