· github-actions / gitlab-ci / cicd
GitHub Actions vs GitLab CI — chọn cái nào năm 2026?
Câu trả lời gần như luôn là nền tảng lưu code của bạn. Đây là những điểm tạo ra sự khác biệt: quét bảo mật, giá theo quy mô, và những gì gãy khi bạn migrate.
Bởi Ethan
2.783 từ · 14 phút đọc
Nếu code của bạn đang ở trên GitHub, dùng GitHub Actions. Nếu đang ở trên GitLab, dùng GitLab CI. Đó là kết luận dành cho phần lớn đội đang đọc bài này. Tiếp tục nếu bạn thuộc nhóm 15% còn lại: đang migrate giữa các nền tảng, chọn code host cho một org mới, hoặc muốn xem liệu lựa chọn CI hiện tại có đang tốn tiền không đáng hay không.
Bài này dành cho ai
Các đội kỹ thuật đang đánh giá CI/CD trong năm 2026 — đặc biệt là bất kỳ ai đang tính toán chi phí chuyển nền tảng, hoặc xây mới và phải chọn cả code host lẫn CI cùng một lúc. Nếu bạn đang ổn với nền tảng hiện tại và không có lý do cụ thể để chuyển, chi phí migration một mình đã đủ để kết luận: đừng chuyển.
Những gì thay đổi trong năm 2026
Cả hai nền tảng đã có bước tiến đáng kể so với năm 2024.
GitHub Actions ra mắt runner Linux 1 vCPU vào ngày 22 tháng 1 năm 2026 với giá $0.002/phút — một phần ba mức giá của runner 2-core. Một mức phí $0.002/phút cho self-hosted runner được thông báo vào tháng 3 năm 2026, sau đó hoãn vô thời hạn sau phản ứng của cộng đồng. Custom runner image snapshot đạt GA vào tháng 4, cho phép các đội đóng gói dependencies vào VM snapshot có phiên bản.
GitLab CI đưa pipeline inputs lên GA (GitLab 17.11), gỡ bỏ DAST analyzer dựa trên proxy cũ (deprecated từ 16.9, gỡ ở 17.3), và vào tháng 4 năm 2026 tung ra tính năng tự động remediation lỗ hổng SAST qua GitLab Duo cho khách hàng Ultimate. Nền tảng này đã chuyển SAST từ các analyzer theo ngôn ngữ sang Semgrep trong suốt năm 2025.
Cả hai nền tảng hiện tại đều khác đáng kể so với hai năm trước.
Giá: con số thường quyết định tất cả
Free tier của hai bên không tương đương nhau.
| GitHub Free | GitHub Team | GitHub Enterprise | GitLab Free | GitLab Premium | GitLab Ultimate | |
|---|---|---|---|---|---|---|
| Giá | $0 | $4/user/tháng | $21/user/tháng | $0 (≤5 người) | $29/user/tháng | Theo báo giá |
| Phút Linux/tháng | 2.000 | 3.000 | 50.000 | 400 | 10.000 | 50.000 |
| Storage | 500 MB | 2 GB | 50 GB | 10 GiB | 500 GiB | 500 GiB |
GitLab Free cho 400 phút mỗi tháng. Với bất kỳ dự án nào có commit thường xuyên, con số đó hết trong vài ngày. GitHub Free cho 2.000 — gấp năm lần — trước khi bạn bắt đầu trả tiền.
Ở các gói trả phí, phép tính phức tạp hơn. GitLab Premium giá $29/user/tháng với 10.000 phút bao gồm. GitHub Team giá $4/user/tháng với 3.000 phút. Phút bổ sung của GitLab chạy $0.01/phút; phút bổ sung GitHub Linux 2-core chạy $0.006/phút. Theo giá phút, GitHub rẻ hơn; theo số phút được bao gồm, GitLab Premium cho nhiều thời gian CI hơn trên mỗi đô la khi đội có từ hai ba người trở lên.
Với hầu hết các đội chạy ở quy mô lớn, self-hosted runner làm cho bài so sánh này không còn ý nghĩa. Cả hai nền tảng đều chạy miễn phí trên phần cứng tự host — phí self-hosted runner của GitHub hiện vẫn đang hoãn.
Cấu hình runner và thời gian khởi động
ubuntu-latest trên GitHub Actions là Ubuntu 24.04 (chuyển từ 22.04 vào tháng 10 năm 2024). Job trên private repo được cấp 2 vCPU, 8 GB RAM, 14 GB SSD. Public repo được 4 vCPU, 16 GB RAM — tài nguyên tăng gấp đôi cho OSS.
Shared runner của GitLab là các ephemeral container chạy trên Kubernetes. Runner “Linux small” cung cấp khoảng 1 vCPU; GitLab không công bố thông số phần cứng cố định cho shared SaaS runner.
Độ trễ khởi động là nơi khoảng cách kiến trúc thể hiện rõ. GitHub pre-provision một pool VM đã sẵn sàng; job của bạn nhận một máy đang chạy OS rồi. Shared runner của GitLab spin Kubernetes pod theo yêu cầu — container scheduler thêm overhead trước khi dòng code đầu tiên chạy.
Hệ quả thực tế: GitHub Actions job khởi động nhanh hơn trên shared infrastructure. Với pipeline fan-out ra nhiều job song song, khoảng chênh lệch đó nhân lên trên mỗi commit. Đội enterprise ở cả hai nền tảng đều có thể loại bỏ hoàn toàn cold-start bằng autoscaling runner tùy chỉnh. Với các đội ở tier Free hoặc Team trên GitHub, lợi thế kiến trúc là có thực — nhưng hãy đo workload của chính mình trước khi coi bất kỳ con số benchmark bên thứ ba nào là chân lý.
Cú pháp YAML: cùng một pipeline, hai cách viết
Đây là một pipeline giống hệt nhau trên mỗi nền tảng — test Node.js 20, build Docker, push lên registry, deploy lên staging.
GitHub Actions
# .github/workflows/ci.yml
name: CI/CD Pipeline
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "20"
cache: "npm"
- run: npm ci
- run: npm test
build-and-push:
needs: test
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
id-token: write
steps:
- uses: actions/checkout@v4
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v5
with:
push: ${{ github.ref == 'refs/heads/main' }}
tags: ghcr.io/${{ github.repository }}:${{ github.sha }}
deploy-staging:
needs: build-and-push
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
environment: staging
steps:
- name: Deploy to staging
run: |
echo "Deploying ghcr.io/${{ github.repository }}:${{ github.sha }}"
# kubectl set image deployment/app app=ghcr.io/${{ github.repository }}:${{ github.sha }}
GitLab CI
# .gitlab-ci.yml
image: node:20-slim
stages:
- test
- build
- deploy
variables:
DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
cache:
key:
files:
- package-lock.json
paths:
- node_modules/
test:
stage: test
script:
- npm ci
- npm test
build-image:
stage: build
image: docker:24
services:
- docker:24-dind
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
script:
- docker build -t $DOCKER_IMAGE .
- docker push $DOCKER_IMAGE
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
deploy-staging:
stage: deploy
image: bitnami/kubectl:latest
script:
- echo "Deploying $DOCKER_IMAGE to staging"
# - kubectl set image deployment/app app=$DOCKER_IMAGE
environment:
name: staging
url: https://staging.example.com
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
Những khác biệt cấu trúc quan trọng trong công việc hàng ngày:
| Khái niệm | GitHub Actions | GitLab CI |
|---|---|---|
| Lệnh chạy | run: | script: |
| Thứ tự job | Graph needs: tường minh | Ngầm định qua chuỗi stages: |
| Biến | ${{ github.sha }} | $CI_COMMIT_SHA |
| Điều kiện | if: github.ref == 'refs/heads/main' | rules: - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH |
| Caching | Action actions/cache@v4 | Block cache: paths: gốc |
| Container registry | ghcr.io (cần cấu hình riêng) | $CI_REGISTRY — tự inject, không cần config |
Container registry tích hợp sẵn của GitLab là một trong những thứ “nhỏ mà không hề nhỏ.” $CI_REGISTRY_USER và $CI_REGISTRY_PASSWORD được inject tự động vào mọi job — không cần cấu hình gì. GitHub yêu cầu thiết lập token tường minh cho các kịch bản cross-project.
Nếu đội bạn deploy lên Cloudflare Pages hoặc Workers, cả hai nền tảng đều có tích hợp xử lý wrangler deploy như một bước trong pipeline. Tính năng theo dõi environment gốc của GitLab cho khả năng rollback ngay trong giao diện MR; Marketplace của GitHub có nhiều tích hợp deploy bên thứ ba hơn. Để so sánh chi tiết các lựa chọn serverless phù hợp với CI, xem bài Cloudflare Workers vs AWS Lambda của chúng tôi.
Quét bảo mật: nơi GitLab chiếm ưu thế rõ ràng
Đây là điểm khác biệt sản phẩm rõ nhất giữa hai nền tảng trong năm 2026.
| Tính năng | GitHub Actions | GitLab CI |
|---|---|---|
| SAST | GitHub Advanced Security (trả phí) hoặc marketplace | Tích hợp sẵn Free/Premium/Ultimate |
| Phát hiện secret | GHAS hoặc marketplace | Tích hợp sẵn (dựa trên Gitleaks) |
| Quét container | Marketplace action | Tích hợp sẵn (dựa trên Trivy) |
| DAST | Marketplace action | Tích hợp sẵn v5, browser-based (Ultimate) |
| Quét dependency | GHAS hoặc marketplace | Tích hợp sẵn (Ultimate) |
| Tự động remediation lỗ hổng | Không có | GitLab Duo (Ultimate, GA tháng 4 năm 2026) |
GitLab Free bao gồm SAST, phát hiện secret, và quét container. Đó là ba hạng mục công cụ bảo mật mà đội bạn có ngay mà không cần viết marketplace action hay trả thêm tiền.
Để có coverage tương đương trên GitHub, bạn cần GitHub Advanced Security — một add-on trả phí cho Team và Enterprise. Hoặc bạn tự lắp ráp marketplace action (Trivy cho container, Gitleaks cho secret, Semgrep cho SAST) — cách này hoạt động nhưng đòi bảo trì và không tích hợp vào giao diện PR review theo cách widget MR của GitLab làm.
Với các đội trong ngành có quy định chặt hoặc cần kết quả bảo mật nằm trong nền tảng thay vì dashboard bên ngoài, bộ công cụ tích hợp của GitLab là lý do đủ để quyết định.
Marketplace vs Component Catalog
GitHub Marketplace có hơn 10.000 action đã được publish. Có action cho hầu như mọi thứ: deploy lên mọi cloud provider, mọi dịch vụ thông báo, mọi công cụ chất lượng code, mọi kiểm tra compliance. Tìm thứ cần dùng thường chỉ là một lần tìm kiếm.
Component Catalog của GitLab hoạt động được nhưng nhỏ hơn đáng kể. GitLab duy trì khoảng 80 component chính thức tại gitlab.com/components. Đóng góp cộng đồng có, nhưng lựa chọn hẹp hơn và không có con số công khai.
Hệ thống template include: của GitLab lấp một phần khoảng trống này — template dựng sẵn cho Docker build, các bước Auto DevOps pipeline, và setup ngôn ngữ phổ biến được duy trì tốt. Nhưng nếu bạn đang thay thế một GitHub workflow dùng năm marketplace action từ các vendor khác nhau, hãy chuẩn bị tự viết phần tương đương.
Sự bất đối xứng này thể hiện rõ nhất khi migration. Chuyển từ GitHub sang GitLab, phần viết lại YAML là phần xử lý được. Phần khó là thay thế các action không có bản tương đương trên GitLab.
Self-hosting
Cả hai nền tảng hỗ trợ self-hosted runner trên mọi gói trả phí, với $0/phút.
GitLab có lợi thế về mô hình thực thi cho các workload Kubernetes:
- Native Kubernetes executor — first-party, ổn định, production-grade. Hỗ trợ k8s của GitLab Runner đã chạy trong production nhiều năm. Thiết lập được tài liệu hóa tốt và hành vi autoscaling có thể dự đoán được.
- Bản tương đương của GitHub —
actions-runner-controller(ARC), do GitHub bảo trì. Chạy được, nhưng nằm ở một lớp abstraction khác. Các đội chạy Kubernetes-native infrastructure thường thấy executor của GitLab tự nhiên hơn để vận hành.
Về SSO, GitLab Premium bao gồm SAML ở mức $29/user/tháng. GitHub yêu cầu tier Enterprise ($21/user/tháng cơ bản, nhưng SAML chỉ dành cho enterprise). Nếu SSO là yêu cầu bắt buộc, đây là bài tính đáng chạy thử.
Với các triển khai hoàn toàn air-gapped, GitLab Self-Managed cung cấp toàn bộ nền tảng — CI, container registry, issue tracking, merge request workflow — trong một bản cài đặt. GitHub Enterprise Server làm điều tương tự, nhưng feature parity của self-managed so với GitHub.com lịch sử vẫn chậm hơn.
Chi phí migration
Các đội thường đánh giá thấp con số này từ 3 đến 5 lần.
GitHub Actions → GitLab CI
Mọi workflow file cần viết lại hoàn toàn. YAML không tương thích về cấu trúc — needs: vs stages:, run: vs script:, cú pháp expression vs biến CI định sẵn. Tìm-và-thay-thế xử lý được các phép thế hiển nhiên; đồ thị phụ thuộc job và logic điều kiện đòi tái cấu trúc thực sự.
Chi phí lớn hơn là marketplace action. Với mỗi GitHub action mà pipeline đang dùng, bạn hoặc tìm bản tương đương trong Component Catalog, tìm template include: của GitLab, hoặc tự viết shell script. Một số có bản 1:1; nhiều cái thì không. Cú pháp OIDC cloud auth thay đổi giữa các nền tảng.
GitHub không cung cấp công cụ migration chính thức từ GitHub Actions sang GitLab CI. GitLab cung cấp tài liệu migration nhưng không có importer tự động theo chiều này.
Ước tính sơ bộ dựa trên các đội đã thực hiện:
- 5–10 workflow, job đơn giản: 2–5 ngày
- 50+ workflow với nhiều marketplace action phức tạp: 4–8 tuần
GitLab CI → GitHub Actions
GitHub cung cấp Actions Importer — công cụ tự động tạo workflow file GitHub Actions từ .gitlab-ci.yml. Công cụ này convert stage, job, biến, script, và logic điều kiện. Biến bị mask, artifact report, cấu hình self-hosted runner, và những gì importer không parse được đòi sửa thủ công.
Chi phí ẩn ở đây là công cụ bảo mật. Nếu pipeline GitLab của bạn đang dựa vào SAST và phát hiện secret tích hợp sẵn, bạn phải xây lại coverage đó từ đầu trên GitHub. Tính vào ngân sách cho GHAS hoặc chi phí lắp ráp và bảo trì marketplace action tương đương.
Những gì bạn được khi chuyển sang GitHub: Hệ sinh thái Marketplace rộng, khởi động nhanh hơn, tích hợp GitHub Copilot, onboarding đơn giản hơn cho developer đã quen GitHub.
Những gì bạn mất: Bộ quét bảo mật tích hợp, container registry theo project, Auto DevOps, luồng issue và MR gốc của GitLab.
Kết luận
Chọn GitHub Actions nếu:
- Code của bạn đã ở trên GitHub — chi phí migration hiếm khi đủ lý do để chỉ chuyển CI
- Bạn cần chiều sâu của 10.000+ tích hợp marketplace
- Tốc độ khởi động quan trọng và bạn không chạy self-hosted
- Đội dùng GitHub Copilot và muốn tích hợp CI gốc
Nếu công cụ AI coding cũng là yếu tố trong quyết định của bạn, xem bài so sánh AI coding CLI tốt nhất năm 2026 để so sánh Copilot, Claude Code và Gemini CLI một cách chi tiết.
Chọn GitLab CI nếu:
- Code của bạn đang ở trên GitLab (self-managed hoặc GitLab.com)
- Bạn cần coverage DevSecOps (SAST/phát hiện secret/quét container) mà không tốn thêm license
- Bạn chạy infrastructure nặng Kubernetes và muốn runner executor gốc
- SAML SSO là bắt buộc nhưng bạn không muốn trả giá Enterprise
- Bạn vận hành trong môi trường có quy định chặt hoặc air-gapped cần triển khai self-managed đầy đủ
Lý do “code đang ở đâu thì dùng CI ở đó” không phải lười biếng — đó là phép tính trung thực. Nền tảng nơi code của bạn nằm đã có sẵn webhook, PR trigger, access token, và mental model của cả đội. Chuyển CI không chỉ là viết lại YAML; đó là ma sát trên mỗi workflow tiếp theo mà đội bạn xây.
Lưu ý
Bài này phản ánh trạng thái nền tảng tính đến tháng 5 năm 2026. Phí self-hosted runner của GitHub (thông báo tháng 3 năm 2026, hoãn vô thời hạn) có thể quay lại — hãy tính rủi ro đó vào mô hình chi phí dài hạn cho fleet tự host private quy mô lớn. Free tier của GitLab (400 phút/tháng) đủ chặt để bất kỳ dự án nào commit đều đặn đều chạm trần; hãy tính ngân sách cho Premium hoặc self-hosted từ ngày đầu.
Chúng tôi chưa benchmark custom runner image warm-start (GA tháng 4 năm 2026 trên GitHub) so với bản tương đương của GitLab — đây là bài so sánh đáng chạy cho các đội mà cold-start là chi phí thực sự.
Liên kết Cloudflare Pages ở trên là affiliate link.
Tham khảo
- Tài liệu thanh toán GitHub Actions
- Giá runner GitHub Actions
- Tham chiếu GitHub-hosted runner
- GitHub 1-vCPU runner GA (tháng 1 năm 2026)
- GitHub GPU runner GA (tháng 7 năm 2024)
- GitHub Actions Importer cho migration GitLab
- Hướng dẫn migration GitLab CI từ GitHub Actions
- Trang giá GitLab
- Tài liệu compute minutes GitLab
- Tài liệu SAST GitLab
- Tài liệu DAST GitLab
- GitLab CI/CD Component Catalog
- Thông báo GitLab Agentic AI (tháng 4 năm 2026)
- GitHub Marketplace đạt mốc 10.000 action
- Benchmark CPU GitHub Actions của RunsOn
- Benchmark runner của SocialGouv