Quay lại danh sách
Tin tức công nghệ

Xây dựng hệ thống CI/CD riêng với GitLab Runner trên VPS: Tự động hóa quy trình test và deploy code

17 tháng 5, 2026

Giới thiệu về CI/CD và lợi ích của hệ thống tự chủ

Trong thế giới phát triển phần mềm hiện đại, Continuous Integration và Continuous Deployment (CI/CD) đã trở thành yếu tố then chốt quyết định tốc độ và chất lượng của quy trình phát triển. CI/CD không chỉ là một tập hợp công cụ, mà là một triết lý phát triển giúp tự động hóa các bước kiểm thử, build và triển khai ứng dụng. Trong khi các dịch vụ CI/CD đám mây như GitLab CI, GitHub Actions hay Jenkins Cloud cung cấp giải pháp nhanh chóng, việc xây dựng hệ thống CI/CD riêng trên VPS mang lại những lợi thế đặc biệt về bảo mật, chi phí và kiểm soát.

Hệ thống CI/CD tự chủ cho phép bạn kiểm soát hoàn toàn môi trường thực thi, cấu hình bảo mật theo yêu cầu riêng, và tối ưu hóa chi phí cho các dự án dài hạn. Đặc biệt với các tổ chức có yêu cầu bảo mật cao hoặc làm việc với mã nguồn nhạy cảm, việc sở hữu infrastructure CI/CD là một lựa chọn chiến lược.

Tại sao chọn GitLab Runner trên VPS?

GitLab Runner là thành phần thực thi của GitLab CI/CD, có thể được cài đặt trên bất kỳ server nào. Kết hợp với VPS, bạn tạo được một hệ thống CI/CD mạnh mẽ với những ưu điểm vượt trội:

  • Kiểm soát hoàn toàn: Bạn quyết định cấu hình phần cứng, hệ điều hành, và các phần mềm cần thiết
  • Bảo mật tối đa: Mã nguồn và quy trình build không rời khỏi infrastructure của bạn
  • Chi phí tối ưu: Chỉ trả cho tài nguyên thực sự sử dụng, không phụ thuộc vào pricing model của nhà cung cấp dịch vụ
  • Hiệu suất ổn định: Không chia sẻ tài nguyên với các tổ chức khác, tránh được hiện tượng "noisy neighbor"
  • Tích hợp linh hoạt: Dễ dàng kết nối với các hệ thống nội bộ khác như registry Docker private, hệ thống monitoring, hoặc kho lưu trữ artifact

Chuẩn bị môi trường VPS

Bước đầu tiên trong việc xây dựng hệ thống CI/CD là chuẩn bị VPS đáp ứng yêu cầu kỹ thuật. Dưới đây là các yêu cầu tối thiểu và khuyến nghị:

Yêu cầu hệ thống

  • Hệ điều hành: Ubuntu 20.04 LTS trở lên hoặc CentOS 7/8 (Ubuntu được khuyến nghị cho cộng đồng hỗ trợ rộng rãi)
  • CPU: Tối thiểu 2 cores (khuyến nghị 4 cores cho xử lý song song)
  • RAM: Tối thiểu 4GB (khuyến nghị 8GB cho các dự án phức tạp)
  • Storage: Tối thiểu 20GB SSD (khuyến nghị 50GB với tốc độ đọc/ghi cao)
  • Kết nối mạng: Đường truyền ổn định với băng thông đủ cho việc tải dependencies và push/pull artifacts

Thiết lập bảo mật cơ bản

Trước khi cài đặt bất kỳ phần mềm nào, cần thiết lập các biện pháp bảo mật cơ bản:

  1. Cập nhật hệ thống: sudo apt update && sudo apt upgrade -y
  2. Cấu hình firewall với UFW: chỉ mở các port cần thiết (22, 80, 443)
  3. Thiết lập SSH key authentication thay vì mật khẩu
  4. Tạo user riêng cho GitLab Runner: sudo adduser gitlab-runner
  5. Cấu hình swap space nếu cần thiết cho các job nặng

Cài đặt và cấu hình GitLab Runner

Cài đặt GitLab Runner

Quy trình cài đặt GitLab Runner trên Ubuntu:

  1. Thêm repository chính thức:
    curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
  2. Cài đặt GitLab Runner:
    sudo apt install gitlab-runner
  3. Kiểm tra phiên bản:
    gitlab-runner --version

Đăng ký Runner với GitLab

Mỗi GitLab Runner cần được đăng ký với GitLab instance của bạn:

  1. Truy cập GitLab project → Settings → CI/CD → Runners
  2. Lấy Registration Token
  3. Chạy lệnh đăng ký:
    sudo gitlab-runner register \
    --url https://gitlab.com/ \
    --registration-token YOUR_REGISTRATION_TOKEN \
    --executor docker \
    --description "VPS Runner" \
    --tag-list "vps,linux,docker" \
    --docker-image "docker:latest"

Trong đó, executor quyết định môi trường thực thi job. Docker executor được khuyến nghị vì tính nhất quán và khả năng cô lập.

Thiết kế pipeline CI/CD hiệu quả

Cấu trúc file .gitlab-ci.yml cơ bản

File .gitlab-ci.yml định nghĩa toàn bộ quy trình CI/CD. Dưới đây là cấu trúc mẫu cho dự án Node.js:

stages:
- test
- build
- deploy

variables:
DOCKER_DRIVER: overlay2

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

unit-test:
stage: test
image: node:16-alpine
script:
- npm ci
- npm test
artifacts:
reports:
junit: junit.xml

build-image:
stage: build
image: docker:latest
services:
- docker:dind
script:
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
only:
- main

deploy-production:
stage: deploy
image: alpine:latest
script:
- apk add --no-cache openssh-client
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | ssh-add -
- ssh -o StrictHostKeyChecking=no user@production-server "docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA"
- ssh -o StrictHostKeyChecking=no user@production-server "docker-compose up -d"
only:
- main

Các stage quan trọng trong pipeline

  • Test Stage: Chạy unit test, integration test, và code quality checks
  • Build Stage: Build ứng dụng, tạo Docker images, và push lên registry
  • Deploy Stage: Triển khai ứng dụng lên môi trường staging/production
  • Security Scan (tuỳ chọn): Quét lỗ hổng bảo mật trong dependencies và code

Tối ưu hóa hiệu suất và bảo mật

Tối ưu hiệu suất thực thi

Để hệ thống CI/CD hoạt động hiệu quả, cần áp dụng các kỹ thuật tối ưu:

  • Sử dụng cache hiệu quả: Cache dependencies giữa các pipeline để giảm thời gian tải
  • Parallel execution: Chạy các job độc lập song song khi có thể
  • Chọn base image phù hợp: Sử dụng Alpine-based images cho kích thước nhỏ và thời gian pull nhanh
  • Docker layer caching: Tận dụng cache layer trong quá trình build Docker images
  • Resource monitoring: Theo dõi CPU, RAM, và I/O để điều chỉnh cấu hình phù hợp

Biện pháp bảo mật nâng cao

Hệ thống CI/CD xử lý mã nguồn và credentials nhạy cảm, cần được bảo vệ nghiêm ngặt:

  1. Secret management: Sử dụng GitLab CI Variables với mask enabled cho các thông tin nhạy cảm
  2. Network isolation: Cấu hình VPS trong private network nếu có thể
  3. Regular updates: Cập nhật GitLab Runner và Docker engine thường xuyên
  4. Access control: Giới hạn quyền truy cập vào runner và chỉ chạy job từ trusted projects
  5. Audit logging: Bật logging chi tiết và giữ logs trong thời gian đủ dài cho việc kiểm tra

Xử lý sự cố và monitoring

Theo dõi hệ thống CI/CD

Giám sát hoạt động của hệ thống giúp phát hiện sớm vấn đề và tối ưu hiệu suất:

  • GitLab Runner metrics: Sử dụng embedded Prometheus metrics của GitLab Runner
  • System monitoring: Cài đặt tools như htop, nmon, hoặc Netdata
  • Pipeline analytics: Sử dụng GitLab CI/CD analytics để theo dõi thời gian thực thi pipeline
  • Alerting: Thiết lập cảnh báo khi runner offline hoặc job thất bại liên tục

Khắc phục sự cố thường gặp

Một số vấn đề phổ biến và cách giải quyết:

Runner không nhận job: Kiểm tra trạng thái runner với sudo gitlab-runner verify và đảm bảo tags khớp với job configuration.

Job thất bại do hết bộ nhớ: Tăng swap space hoặc giới hạn memory usage trong Docker daemon configuration.

Network timeout khi pull images: Cấu hình Docker registry mirror hoặc sử dụng images cached locally.

Chiến lược mở rộng hệ thống

Khi nhu cầu phát triển, hệ thống CI/CD cần được mở rộng để đáp ứng:

Scalability patterns

  • Multiple runners: Triển khai nhiều runner cho các mục đích khác nhau (test, build, deploy)
  • Autoscaling: Sử dụng Docker Machine executor để tự động scale runner dựa trên workload
  • Distributed caching: Triển khai distributed cache (Redis, S3) cho các runner cluster
  • Hybrid approach: Kết hợp runner tự quản lý với GitLab.com shared runners cho workload đột biến

Cost optimization

Tối ưu chi phí vận hành hệ thống CI/CD:

  1. Sử dụng spot instances hoặc reserved instances cho VPS
  2. Shutdown runner không hoạt động trong giờ không làm việc
  3. Clean up Docker images và cache định kỳ
  4. Monitor và điều chỉnh resource allocation dựa trên usage pattern

Kết luận

Xây dựng hệ thống CI/CD riêng với GitLab Runner trên VPS là một khoản đầu tư chiến lược mang lại lợi ích lâu dài về kiểm soát, bảo mật và chi phí. Mặc dù đòi hỏi effort ban đầu cao hơn so với sử dụng dịch vụ managed, hệ thống tự chủ cung cấp sự linh hoạt và tối ưu không thể đạt được với giải pháp one-size-fits-all.

Bắt đầu với cấu hình đơn giản, tập trung vào việc tự động hóa quy trình test và deploy cơ bản. Khi team phát triển và nhu cầu phức tạp hơn, từ từ mở rộng hệ thống với các tính năng nâng cao như security scanning, performance testing, và multi-environment deployment. Quan trọng nhất, luôn giữ nguyên tắc "infrastructure as code" - quản lý cấu hình runner và pipeline bằng code để đảm bảo khả năng tái tạo và version control.

Hệ thống CI/CD không phải là điểm đến, mà là một hành trình cải tiến liên tục. Bằng cách sở hữu và hiểu rõ từng thành phần trong hệ thống, bạn không chỉ tăng tốc độ phát triển phần mềm mà còn xây dựng được năng lực kỹ thuật quan trọng cho tổ chức.