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:
- install: Cài đặt dependencies
npm install - lint: Kiểm tra coding standards
- build: Biên dịch code production
- 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.