Hướng Dẫn Toàn Diện GitLab CI/CD: Từ Cơ Bản Đến Nâng Cao

Giới Thiệu Khái Niệm

1.1 GitLab CI && Cơ Chế Hoạt Động Của Công Cụ Triển Khai Tự Động

Xét ví dụ về GitLab CI:

(1) Điều Khiển Quy Trình Qua File Cấu Hình

  • Bằng cách định nghĩa file .gitlab-ci.yml trong thư mục gốc của dự án, ta có thể kiểm soát các giai đoạn khác nhau của quy trình CI
  • Nền tảng GitLab sẽ quét file này và thực thi toàn bộ quy trình CI theo đúng cấu hình định sẵn

(2) Cơ Chế Kích Hoạt

  • Quy trình CI được tự động kích hoạt mỗi khi thành viên trong nhóm thực hiện push/merge
  • Mỗi lần push/merge, GitLab CI đều kiểm tra file .gitlab-ci.yml trong dự án
  • Nếu file tồn tại, các script được viết trong đó sẽ được thực thi, hoàn thành quy trình từ cài đặt, kiểm tra, biên dịch đến triển khai

(3) Liên Kết Nền Tảng Thực Thi

  • GitLab CI sử dụng phần mềm gitlab-runner để chỉ định nền tảng thực thi CI
  • Tải và chạy phần mềm dòng lệnh này trên nền tảng tương ứng, nhập token lấy từ GitLab
  • Có thể liên kết máy hiện tại với quy trình CI của GitLab, tất cả các tác vụ CI sẽ được thực thi trên nền tảng đó

(4) Trực Quan Hóa Quy Trình

  • Tất cả trạng thái các node trong quy trình CI đều có thể được theo dõi real-time trên giao diện GitLab
  • Do cách thực thi tương tự như một đường ống nhiều đoạn, thường gọi là "Pipeline"

(5) Độc Lập Giữa Các Quy Trình

  • Các quy trình CI được kích hoạt bởi các lần push/merge khác nhau không ảnh hưởng lẫn nhau
  • Thuận tiện cho việc kiểm thử song song theo các phiên bản khác nhau

(6) Kích Hoạt Thủ Công

  • Pipeline không chỉ hỗ trợ kích hoạt tự động mà còn hỗ trợ kích hoạt thủ công

1.2 Lợi Ích Của Triển Khai Tự Động

Vấn Đề Của Quy Trình Truyền Thống:

  • Sau khi sửa bug cần triển khai code thủ công lên môi trường test
  • Công việc triển khai phức tạp, chiếm dụng thời gian phát triển
  • Giai đoạn phát triển - kiểm thử bị liên kết chặt chẽ, làm tăng chi phí giao tiếp trong nhóm

Ưu Điểm Của Triển Khai Tự Động:

1. Nâng Cao Hiệu Suất Phát Triển Và Hợp Tác

  • Sau khi developer commit code, hệ thống sẽ tự động triển khai, tiết kiệm thời gian triển khai thủ công
  • QA có thể theo dõi trạng thái triển khai real-time qua giao diện Pipeline
  • Hỗ trợ QA kích hoạt triển khai thủ công, giảm chi phí giao tiếp

2. Kiểm Soát Chất Lượng Code Tinh Vi

  • Tích hợp các công cụ kiểm tra code như ESLint vào Pipeline
  • Mỗi lần submit/merge đều tự động thực hiện kiểm tra toàn diện
  • Kiểm soát chất lượng code ở mức độ chi tiết hơn

Chuẩn Bị Kiến Thức

2.1 Các Khái Niệm Trừu Tượng Trong GitLab CI

1. Pipeline & Job

  • Pipeline: Toàn bộ quy trình mà GitLab thực thi dựa trên .gitlab-ci.yml
  • Job: Node tác vụ đơn lẻ trong Pipeline, mỗi Job có thuộc tính stage để chỉ định giai đoạn
  • Quan hệ: Một Pipeline chứa nhiều stage, mỗi stage chứa ít nhất một Job

2. Runner

  • Vai trò: Chương trình thực thi Pipeline trên máy cụ thể dựa trên .gitlab-ci.yml
  • Phân loại:
  • Specific Runner: Runner được gắn với một dự án cụ thể
  • Shared Runner: Runner có thể được chia sẻ giữa nhiều dự án

3. Executor

  • Loại nền tảng mà Runner thực thi, cần chọn khi đăng ký
  • Các loại phổ biến: Shell, Docker, SSH, VirtualBox, v.v.
  • So sánh đặc điểm:
  • Shell: Thực thi trực tiếp trong Shell của hệ thống hiện tại
  • Docker: Thực thi trong container Docker, cách ly môi trường tốt
  • SSH: Kết nối SSH đến máy từ xa để thực thi
  • VirtualBox: Thực thi trong máy ảo

2.2 Quy Tắc Cú Pháp Cơ Bản Của File YML

YML là định dạng file cấu hình ngắn gọn hơn JSON.

Ví dụ cấu trúc cơ bản:

yaml

install-task:
  tags:
    - node-runner
  stage: install
  script:
    - npm install

Cú pháp mảng trong YML:

yaml

colors:
  - red
  - blue
  - yellow

Tương đương JSON: {"colors": ["red", "blue", "yellow"]}

Cú pháp đối tượng trong YML:

yaml

person:
  name: john
  age: 25

Tương đương JSON: {"person": {"name": "john", "age": 25}}

Cấu trúc lồng nhau:

yaml

a:
  b:
    - d
  c: e

Tương đương JSON: {"a": {"b": ["d"], "c": "e"}}

Điểm cần lưu ý về cú pháp YML:

  • Sử dụng thụt đầu dòng để thể hiện quan hệ phân cấp
  • Dấu hai chấm biểu diễn cặp key-value
  • Dấu gạch ngang biểu diễn phần tử mảng
  • # biểu diễn comment

2.3 Các Keyword Đặc Biệt Trong Cấu Hình .gitlab-ci.yml

Keyword cốt lõi:

Keyword Tác dụng Ví dụ
stages Định nghĩa các giai đoạn của Pipeline stages: - install - build
stage Định nghĩa giai đoạn mà Job thuộc về stage: install
script Định nghĩa các lệnh Shell cần thực thi script: - npm install
tags Chỉ định tag của Runner tags: - runner-tag

Ví dụ về stages & stage:

yaml

stages:
  - install
  - lint
  - build
  - deploy

Ví dụ cấu hình Job:

yaml

install:
  tags:
    - node-runner
  stage: install
  script:
    - npm install

Tầm quan trọng của tags:

  • Runner sử dụng tags để xác định có thể thực thi Job hiện tại hay không
  • Chỉ khi tags của Job khớp với tags của Runner thì Job mới được thực thi

Thực Hành CI

3.1 Viết "hello world" Với GitLab CI

1. Tải Và Cài Đặt GitLab Runner

Hệ điều hành macOS:

bash

sudo curl --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-darwin-amd64
sudo chmod +x /usr/local/bin/gitlab-runner

2. Khởi Tạo GitLab Runner

bash

cd ~
gitlab-runner install
gitlab-runner start

3. Đăng Ký Runner

bash

sudo gitlab-runner register

Cần nhập các thông tin sau:

  • URL instance GitLab
  • Registration token (lấy tại: Project Settings > CI/CD > Runners)
  • Mô tả Runner
  • Tags của Runner (ví dụ: node-runner)
  • Executor (ví dụ: shell)

4. Kích Hoạt Runner Nếu Runner chưa được kích hoạt, thực hiện:

bash

sudo gitlab-runner verify

5. Lập Kế Hoạch Các Giai Đoạn Pipeline Các giai đoạn Pipeline điển hình cho dự án frontend:

  1. install: Cài đặt dependencies npm install
  2. lint: Kiểm tra coding standards
  3. build: Biên dịch code production
  4. deploy: Triển khai lên server

6. Chuẩn Bị Môi Trường Triển Khai

  • Đăng ký cloud server (như AWS, Google Cloud, v.v.)
  • Cài đặt Web server qua SSH:

bash

sudo apt-get install nginx
  • Thư mục tài nguyên website: /var/www/html/

7. Viết File Cấu Hình .gitlab-ci.yml

yaml

stages:
  - install
  - lint
  - build
  - deploy

cache:
  paths:
    - node_modules
    - dist

install-task:
  tags:
    - node-runner
  stage: install
  script:
    - npm install

lint-task:
  tags:
    - node-runner
  stage: lint
  script:
    - npm run lint

build-task:
  tags:
    - node-runner
  stage: build
  script:
    - npm run build

deploy-task:
  tags:
    - node-runner
  stage: deploy
  script:
    - sshpass -p $SERVER_PASSWORD scp -r ./dist $DEPLOY_USER@$SERVER_IP:/var/www/html

Cấu hình package.json:

json

{
  "scripts": {
    "start": "react-scripts start",
    "build": "npx react-scripts build",
    "lint": "eslint ./src"
  }
}

8. Commit Code Để Kích Hoạt CI

bash

git add .
git commit -m "feat: configure gitlab ci pipeline"
git push

Tổng Hợp Các Vấn Đề Thường Gặp

1. Vấn Đề Runner Chưa Được Kích Hoạt

  • Biểu hiện: Runner hiển thị trạng thái chưa kích hoạt trên panel
  • Giải pháp:

bash

sudo gitlab-runner verify
sudo gitlab-runner restart

2. Job Bị Treo Không Có Runner Xử Lý

  • Nguyên nhân 1: Runner chưa được kích hoạt
  • Nguyên nhân 2: Tags của Job không khớp với Runner
  • Nguyên nhân 3: Xung đột giữa nhiều Runner
  • Giải pháp:

bash

# Xóa Runner cũ
sudo gitlab-runner unregister --all-runners
# Đăng ký lại với token mới

3. Specific Runner Bị Shared Runner Chiếm Quyền

  • Biểu hiện: Job được thực thi bởi Shared Runner thay vì Specific Runner
  • Giải pháp: Tắt Shared Runner trong panel GitLab

GitLab CI Nâng Cao

5.1 Tái Sử Dụng Đoạn Code Và Module Hóa Trong YML

Tái sử dụng đoạn YML

yaml

.base-config: &baseConfig
  only:
    refs:
      - develop
      - release

install-task:
  <<: *baseConfig
  stage: install
  script:
    - npm install

build-task:
  <<: *baseConfig
  stage: build
  script:
    - npm run build

Module hóa YML Cấu trúc dự án:

text

├── .gitlab-ci.h5.yml ├── .gitlab-ci.bd.yml ├── .gitlab-ci.wx.yml └── .gitlab-ci.yml

File cấu hình chính:

yaml

include:
  - '/.gitlab-ci.wx.yml'
  - '/.gitlab-ci.bd.yml'
  - '/.gitlab-ci.h5.yml'

Keyword extend

yaml

.base-config:
  only:
    refs:
      - develop
      - release

install-task:
  extends: .base-config
  stage: install
  script:
    - npm install

5.2 Các Keyword Cấu Hình Khác Của GitLab CI

Keyword cache

yaml

cache:
  paths:
    - node_modules/
    - dist/
  key: ${CI_COMMIT_REF_SLUG}

Keyword artifacts

yaml

build-task:
  stage: build
  script:
    - npm run build
  artifacts:
    name: 'bundle'
    paths:
      - dist/
    expire_in: 1 week

Keyword only/except

yaml

task:
  only:
    - /^feature-.*$/
    - develop
    - release
  except:
    - tags

allow_failure

yaml

task1:
  stage: test
  script:
    - execute_script_that_may_fail
  allow_failure: true

retry

yaml

task:
  script:
    - deploy_cmd
  retry: 2

timeout

yaml

task:
  script: rspec
  timeout: 3h 30m

when

yaml

task:
  script: cleanup
  when: always

image/services (Tích Hợp Docker)

yaml

image: node:18

services:
  - postgres:15

test-task:
  script:
    - npm test

Việc nắm vững các tính năng nâng cao này cho phép xây dựng các CI/CD pipeline phức tạp và hiệu quả hơn, đáp ứng đa dạng nhu cầu của các dự án.

Đăng vào ngày 9 tháng 7 lúc 12:01