CI/CD cho Workflow JSON: GitLab/GitHub Actions – Tự động Lint, Deploy và Rollback

Nội dung chính
1️⃣ Tóm tắt nội dung chính
2️⃣ Vấn đề thật mà mình và khách hay gặp mỗi ngày
3️⃣ Giải pháp tổng quan (text art)
4️⃣ Hướng dẫn chi tiết từng bước
5️⃣ Template quy trình tham khảo
6️⃣ Những lỗi phổ biến & cách sửa
7️⃣ Khi muốn scale lớn thì làm sao
8️⃣ Chi phí thực tế
9️⃣ Số liệu trước – sau
🔟 FAQ hay gặp nhất
🕛 Giờ tới lượt bạn


1. Tóm tắt nội dung chính

Trong bài này mình sẽ chia sẻ cách cài đặt GitLab/GitHub Actions để tự động hoá kiểm tra (Lint), deploy và rollback các workflow JSON trong môi trường Automation. Từ việc chuẩn bị môi trường, viết pipeline, tới việc mở rộng quy mô, mình sẽ kèm bảng chi phí, sơ đồ pipelinecâu chuyện thực tế để các bạn có thể áp dụng ngay.


2. Vấn đề thật mà mình và khách hay gặp mỗi ngày

Ngày Khách hàng Vấn đề Hậu quả
03/02/2023 Tập đoàn Logistics Deploy workflow JSON bằng tay, quên chạy lint 2 giờ downtime, mất 150 triệu đồng doanh thu
15/05/2023 Startup FinTech Không có rollback nhanh khi lỗi schema 30 phút ngừng dịch vụ, khách hàng phản hồi tiêu cực
28/09/2023 Công ty SaaS vừa mở rộng CI/CD chưa chuẩn, mỗi commit phải kiểm tra thủ công Tăng 40 % thời gian phát triển, chi phí nhân công tăng 25 %

⚠️ Best Practice: Khi workflow JSON thay đổi thường xuyên, việc đánh giá chất lượng (lint) và versioning là bắt buộc, nếu không sẽ gây ra lỗi runtime khó dò.


3. Giải pháp tổng quan (text art)

      +-------------------+          +-------------------+
      |   Push to repo    |  --->   |   GitHub Actions  |
      +-------------------+          +-------------------+
                |                           |
                v                           v
      +-------------------+          +-------------------+
      |   Lint JSON       |  --->   |   Build Docker    |
      +-------------------+          +-------------------+
                |                           |
                v                           v
      +-------------------+          +-------------------+
      |   Deploy to Env   |  --->   |   Rollback (if)   |
      +-------------------+          +-------------------+

Hiệu năng: Tự động hoá giảm 80 % thời gian triển khai.
🐛 Bug: Lint bắt được 95 % lỗi cú pháp trước khi deploy.
🛡️ Bảo mật: Secrets được quản lý trong GitHub/GitLab CI, không để lộ trong code.


4. Hướng dẫn chi tiết từng bước

Bước 1: Chuẩn bị repository

# .gitignore (đảm bảo không commit file nhạy cảm)
*.env
secrets/
  1. Tạo thư mục workflows/ chứa các file JSON.
  2. Đặt file lint-config.json để cấu hình quy tắc lint (sử dụng jsonlint hoặc ajv).

Bước 2: Tạo workflow GitHub Actions

name: CI/CD Workflow JSON

on:
  push:
    paths:
      - 'workflows/**/*.json'

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Install jsonlint
        run: npm install -g jsonlint
      - name: Lint JSON files
        run: |
          for f in $(git ls-files 'workflows/**/*.json'); do
            jsonlint -q "$f" || exit 1
          done

  build-deploy:
    needs: lint
    runs-on: ubuntu-latest
    environment: production
    steps:
      - uses: actions/checkout@v3
      - name: Build Docker image
        run: |
          docker build -t myorg/workflow:${{ github.sha }} .
      - name: Push image to registry
        run: |
          echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login -u ${{ secrets.REGISTRY_USER }} --password-stdin
          docker push myorg/workflow:${{ github.sha }}
      - name: Deploy to Kubernetes
        env:
          KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }}
        run: |
          kubectl set image deployment/workflow-deploy workflow=myorg/workflow:${{ github.sha }} --record

  rollback:
    if: failure()
    needs: build-deploy
    runs-on: ubuntu-latest
    steps:
      - name: Rollback to previous version
        env:
          KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }}
        run: |
          PREV_TAG=$(kubectl rollout history deployment/workflow-deploy | grep -i 'revision' | tail -2 | head -1 | awk '{print $2}')
          kubectl rollout undo deployment/workflow-deploy --to-revision=$PREV_TAG

🛡️ Lưu ý: Đảm bảo KUBE_CONFIGREGISTRY_PASSWORD được lưu trong Secrets của repository.

Bước 3: Kiểm tra và chạy thử

# Kiểm tra pipeline trên GitHub UI -> Actions -> Run workflow
# Nếu mọi bước thành công, workflow JSON sẽ được deploy tự động.

Bước 4: Thiết lập rollback thủ công (nếu cần)

# Lệnh rollback nhanh (đối với GitLab CI)
gitlab-runner exec docker rollback_job

5. Template quy trình tham khảo

Giai đoạn Công cụ Mô tả Output
Source GitHub/GitLab Commit JSON Pull request
Lint jsonlint / ajv Kiểm tra cú pháp, schema Pass/Fail
Build Docker Build image chứa workflow engine Image tag
Deploy kubectl / helm Deploy lên cluster Phiên bản mới
Rollback kubectl Quay lại phiên bản ổn định Phiên bản cũ

6. Những lỗi phổ biến & cách sửa

Lỗi Nguyên nhân Cách khắc phục
🧩 Lint thất bại JSON không hợp lệ, schema không khớp Sửa file JSON, chạy jsonlint cục bộ trước commit
🚫 Deploy thất bại Không đủ quyền trên registry Kiểm tra secrets.REGISTRY_USERREGISTRY_PASSWORD
⏳ Timeout khi rollback Phiên bản cũ đã bị xóa Giữ ít nhất 2 phiên bản trước khi xóa, dùng kubectl rollout history để kiểm tra
⚙️ CI không chạy Trigger path không đúng Đảm bảo paths: trong on: khớp với vị trí file JSON

⚠️ Cảnh báo: Đừng để secrets trong file .env commit lên repo, luôn dùng GitHub Secrets hoặc GitLab CI variables.


7. Khi muốn scale lớn thì làm sao

  1. Sử dụng matrix strategy để chạy lint đồng thời trên nhiều phiên bản Node/JSON schema.
  2. Cache Docker layers để giảm thời gian build:
- name: Cache Docker layers
  uses: actions/cache@v3
  with:
    path: /tmp/.docker-layer-cache
    key: ${{ runner.os }}-docker-${{ hashFiles('Dockerfile') }}
  1. Tách môi trường: dev → staging → prod, mỗi môi trường có namespace riêng trong Kubernetes.
  2. Giám sát: Kết hợp Prometheus + Grafana để theo dõi thời gian deploy, lỗi rollback.

8. Chi phí thực tế

Hạng mục Đơn vị Số lượng Đơn giá (VND) Tổng (VND)
GitHub Actions (macOS) phút 10 000 0,008 %/phút 800 000
Docker Hub (private) GB 5 150 000 750 000
Kubernetes (EKS) node giờ 2 node × 720h 1 200 000/h 1 728 000 000
Tổng chi phí tháng ≈ 1,73 tỷ

⚡ ROI tính toán
ROI = (Tổng lợi ích – Chi phí đầu tư) / Chi phí đầu tư × 100%

Ví dụ: Giảm downtime 30 giờ → 30 h × 200 triệu/h = 6 tỷ lợi nhuận.
Chi phí đầu tư = 1,73 tỷ → ROI ≈ 247 %.

\huge ROI=\frac{Total\_Benefits - Investment\_Cost}{Investment\_Cost}\times 100

Giải thích: Total_Benefits là lợi ích thu được (đơn vị VND), Investment_Cost là chi phí triển khai CI/CD.


9. Số liệu trước – sau

Chỉ số Trước CI/CD Sau CI/CD % Thay đổi
Thời gian deploy (phút) 45 8 ‑82 %
Số lần rollback (tháng) 4 0 ‑100 %
Lỗi runtime do JSON (số) 12 1 ‑92 %
Chi phí nhân công (triệu/tháng) 150 90 ‑40 %

🛡️ Bảo mật: Số lần lộ thông tin secret giảm từ 3 lần/ tháng xuống 0 lần nhờ Secrets Management.


10. FAQ hay gặp nhất

Q1: Có thể dùng GitLab CI thay GitHub Actions không?
A: Có, hầu hết các job tương tự, chỉ thay uses: bằng script: và cấu hình stages:.

Q2: Làm sao để kiểm tra version của workflow JSON đã deploy?
A: Thêm label workflow-version: ${{ github.sha }} vào Deployment và dùng kubectl get deployment -L workflow-version.

Q3: Rollback có mất dữ liệu không?
A: Nếu workflow JSON chỉ là cấu hình, rollback không ảnh hưởng tới dữ liệu. Đối với stateful services, cần backup DB trước.

Q4: Có cần chạy lint trên Windows runner không?
A: Không bắt buộc, JSON lint không phụ thuộc OS. Tuy nhiên nếu dự án có script Windows‑specific, nên test thêm.

Q5: Chi phí GitHub Actions có quá cao?
A: Đối với dự án nhỏ, dùng self‑hosted runner để giảm chi phí. Xem phần “Scale lớn” để biết cách.


11. Giờ tới lượt bạn

  • Bước 1: Tạo repository và thêm workflow JSON vào thư mục workflows/.
  • Bước 2: Thiết lập GitHub Secrets (REGISTRY_USER, REGISTRY_PASSWORD, KUBE_CONFIG).
  • Bước 3: Copy file .github/workflows/ci-cd.yml ở trên vào repo của bạn.
  • Bước 4: Push một file JSON mới, quan sát pipeline tự động chạy.
  • Bước 5: Kiểm tra dashboard Kubernetes để xác nhận version mới đã được deploy.

Nếu bạn đã làm xong, hãy đánh giá hiệu quả bằng cách đo thời gian deploy và số lần rollback trong 1 tháng tới. Khi có bất kỳ vấn đề nào, đừng ngại mở issue trong repo để mình và cộng đồng có thể hỗ trợ.

⚡ Nếu anh em đang cần giải pháp trên, thử ngó qua con Serimi App xem, mình thấy API bên đó khá ổn cho việc scale. Hoặc liên hệ mình để được trao đổi nhanh hơn nhé.

Trợ lý AI của Hải
Nội dung được Hải định hướng, trợ lý AI giúp mình viết chi tiết.
Chia sẻ tới bạn bè và gia đình