Facebook Pixel

GitLab CI/CD là gì ? Hướng dẫn triển khai CI/CD Pipeline trên GitLab

04 Jun, 2024

GitLab CI/CD là một phần của GitLab, một nền tảng DevOps mã nguồn mở tích hợp cung cấp các công cụ để quản lý toàn bộ vòng đời của một dự án phần mềm.

GitLab CI/CD là gì ? Hướng dẫn triển khai CI/CD Pipeline trên GitLab

Mục Lục

1. GitLab CICD là gì ?

GitLab CI/CD (Continuous Integration and Continuous Deployment/Delivery) là một phần của GitLab, một nền tảng DevOps mã nguồn mở tích hợp cung cấp các công cụ để quản lý toàn bộ vòng đời của một dự án phần mềm (software development life cycle). GitLab CI/CD giúp tự động hóa quy trình xây dựng (Build), kiểm thử (Test) và triển khai mã nguồn  (Deploy), giúp cải thiện chất lượng phần mềm và tăng cường hiệu quả làm việc.

Các thành phần chính của GitLab CICD

  1. Pipeline: Là một tập hợp các Jobs (công việc) được thực thi theo một thứ tự xác định. Mỗi pipeline có thể có nhiều stages (giai đoạn), và mỗi stage có thể có nhiều jobs.
  2. Job: Là một đơn vị công việc cụ thể, ví dụ như biên dịch mã nguồn, chạy kiểm thử, hoặc triển khai ứng dụng. Các jobs trong cùng một stage được thực thi song song, còn các stages được thực thi tuần tự.
  3. Runner: Là các agent chịu trách nhiệm thực thi các jobs. GitLab Runner có thể được cài đặt trên máy chủ riêng hoặc sử dụng các runners được cung cấp bởi GitLab.
  4. .gitlab-ci.yml: Là tệp cấu hình được lưu trữ trong kho mã nguồn (repository) của bạn. Tệp này xác định các pipelines, stages và jobs cần thực thi. Đây là nơi bạn định nghĩa logic CI/CD cho dự án của mình.

2. Hướng dẫn triển khai CICD trên GitLab

  1. Không dùng máy sử dụng chip của Apple để thực hành ví dụ này vì sẽ không thành công, image gitlab có những lỗi nghiêm trọng với loại chip này.
  2. Không sử dụng máy hệ điều hành windows do khó khăn trong việc map docker.sock vào trong container để chạy các câu lệnh docker trong một container, mình chưa tìm ra hướng giải quyết, nào tìm ra mình sẽ update lại bài này

2.1 Cài đặt GitLab & GitLab Runner

Pull về image GitLab phiên bản community edition và chạy lệnh tạo mới container,

Bash
# Pull gitlab image
docker pull gitlab/gitlab-ce
# Tạo network gitlab-net
docker network create gitlab-net
# Khởi tạo container, map port 80 trong container ra port 8099 bên ngoài cho đỡ đụng port với service khác
docker run -d \
  --hostname localhost \
  -p 80:80 \
  -p 443:443 \
  -p 22:22 \
  -e GITLAB_OMNIBUS_CONFIG="external_url 'http://localhost'" \
  --name gitlab \
  --network gitlab-net \
  gitlab/gitlab-ce
  # Truy cập vào bên trong container, thêm chữ winpty nếu dùng máy windows
  docker exec -it gitlab bash
  # Tìm và copy password root bằng lệnh grep
  grep "Password:" /etc/gitlab/initial_root_password
 
Cài đặt GitLab

Truy cập vào link localhost, với tên đăng nhập là root và password đã lấy được ở bên trên

Pull về Image GitLab runner và khởi tạo container

Bash
docker pull gitlab/gitlab-runner
docker run -d --name gitlab-runner  \
  --network=gitlab-net \
  -v /var/run/docker.sock:/var/run/docker.sock \
  gitlab/gitlab-runner:latest
Cài đặt Gitlab Runner

2.2 Tạo mới một GitLab Repository

  1. Đăng nhập vào Gitlab và click chọn vào Create a Project trên màn hình Project như hình phía trên.
  2. Chọn Create blank project: mọi người điền tên project, group của project (thường căn cứ theo team, project, phòng ban), mình chọn group tên demo ứng với tên dự án và ở chế độ Private, chỉ những ai trong nhóm mới thấy được.
  3. Chọn nút Create project.

4. Tạo mới 2 file index.htmlDockerfile có nội dung như bên dưới và push vào branch main

HTML
<html>
    <body>
        <h1>200Lab Website</h1>
    </body>
</html>
Bash
FROM nginx:1.18
COPY index.html /usr/share/nginx/html

2.3 Cấu hình Gitlab Runner

Các bạn vào mục Setting trong trang project gitlab-cicd-example và chọn CI/CD

Tới phần runner thì chọn New project runner, nhớ tick chọn cho phép run untagged job, không thì nó sẽ không hoạt động đâu, điểm dễ nhận ra là job của các bạn luôn trong trạng thái pending,  sau đó các bạn sẽ lấy được url và token ở phần Step 1 bên dưới

Đăng kí GitLab runner với các thông tin được cung cấp, đổi url lại thành gitlab (tên container) do container gitlab-runner không hiểu được localhost là gì nhưng có thể ping đến container gitlab bằng tên do chung một network bridge với nhau, màn hình sẽ hiển thị ra các câu hỏi về tham số bạn chỉ cần confirm lại bằng cách nhấn phím Enter là được

Bash
# Thêm winpty đằng trước nếu dùng máy windows
docker exec -it gitlab-runner gitlab-runner register \
  --url http://gitlab \
  --registration-token glrt-1EjYDJRNbjFzvzrtAs3Q \
  --executor docker \
  --docker-image "docker:stable" \
  --description "local-docker-runner" \
  --docker-volumes /var/run/docker.sock:/var/run/docker.sock

Dấu chấm màu xanh cho biết đã thiết lập runner thành công

2.4 Cấu hình file Gitlab CI

Tạo mới file .gitlab-ci.yml trong project và push lên branch main với nội dung như sau, ở đây mình đang mô phỏng bước build docker image và push image đó lên docker registry, việc mà mình nghĩ các bạn devops làm hằng ngày.

Thực tế thì Pipeline sẽ có nhiều stage nữa, tuy nhiên mình chỉ làm demo nên để một stage duy nhất

Bash
stages:
  - publish

variables:
  TAG_LATEST: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:latest
  TAG_COMMIT: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:$CI_COMMIT_SHORT_SHA

publish:
  image: docker:latest
  stage: publish
  services:
    - docker:dind
  script:
    - docker build -t $TAG_COMMIT -t $TAG_LATEST .
    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
    - docker push $TAG_COMMIT
    - docker push $TAG_LATEST

Kết quả chạy của từng Commit sẽ được tìm thấy ở phần Pipeline

3. Kết luận

Mong rằng bài hướng dẫn trên đây của mình có thể cung cập một vài thông tin hữu ích khi các bạn cấu hình CICD trên Gitlab, tuy rằng còn khá nhiều hạn chế do mình đang dùng máy Chip M1, không chạy được phiên bản docker của gitlab, sau khi chuyển qua Windows thì lại gặp vấn đề về docker sock, nên có thể bài tutorial của mình chưa thật sự hoàn chỉnh, mong mọi người thông cảm mình sẽ lưu ý cải thiện, nếu các bạn gặp lỗi thì có thể search google thử nhé.

Các bài viết liên quan:

Bài viết liên quan

Lập trình backend expressjs

xây dựng hệ thống microservices
  • Kiến trúc Hexagonal và ứng dụngal font-
  • TypeScript: OOP và nguyên lý SOLIDal font-
  • Event-Driven Architecture, Queue & PubSubal font-
  • Basic scalable System Designal font-

Đăng ký nhận thông báo

Đừng bỏ lỡ những bài viết thú vị từ 200Lab