Hướng Dẫn Cấu Hình Gitea Actions Tự Động Đóng Gói Và Đẩy Docker Image Lên GitHub Container Registry (GHCR) Từ VPS Riêng
Giới thiệu về Gitea Actions và Xu Hướng Tự Động Hóa Trên VPS Riêng
Trong kỷ nguyên của DevOps và điện toán đám mây, việc tự động hóa quy trình tích hợp và triển khai liên tục (CI/CD) đã trở thành tiêu chuẩn bắt buộc đối với các đội ngũ phát triển phần mềm. GitHub Actions hay GitLab CI là những công cụ tuyệt vời, nhưng đối với các doanh nghiệp muốn kiểm soát toàn bộ hạ tầng, bảo mật dữ liệu nội bộ và tiết kiệm chi phí, việc tự vận hành một nền tảng Git riêng là giải pháp tối ưu. Đó là lý do Gitea — một giải pháp Git service siêu nhẹ, mạnh mẽ và dễ vận hành — ngày càng trở nên phổ biến.
Kể từ phiên bản 1.19, Gitea đã tích hợp chính thức Gitea Actions, một hệ thống CI/CD có cú pháp tương thích cấu trúc YAML của GitHub Actions. Bài viết này sẽ hướng dẫn bạn từng bước chi tiết để cấu hình Gitea Actions ngay trên máy chủ VPS riêng, tự động hóa quy trình đóng gói (build) ứng dụng thành Docker Image và đẩy (push) lên GitHub Container Registry (GHCR) một cách an toàn và chuyên nghiệp.
---Tại sao nên kết hợp Gitea Actions với GitHub Container Registry (GHCR)?
Việc sử dụng Gitea làm trung tâm lưu trữ mã nguồn (Source Code Management) kết hợp với GHCR làm kho lưu trữ Docker Image mang lại nhiều lợi ích chiến lược cho doanh nghiệp:
- Tối ưu hóa tài nguyên VPS: Quá trình lưu trữ hàng trăm Docker Image với nhiều phiên bản (tags) khác nhau tốn rất nhiều dung lượng ổ cứng. Đẩy Image lên GHCR giúp giảm tải dung lượng lưu trữ cho VPS của bạn.
- Bảo mật và phân quyền chuyên nghiệp: GHCR cung cấp cơ chế phân quyền mạnh mẽ, tích hợp sẵn với hệ sinh thái của GitHub, giúp bạn dễ dàng chia sẻ Docker Image cho các hệ thống Kubernetes hoặc Docker Swarm bên ngoài mà không cần mở công khai mã nguồn.
- Tương thích cao: Do Gitea Actions sử dụng chung chuẩn với GitHub Actions, các nhà phát triển không cần phải học lại cú pháp mới, giảm thiểu tối đa chi phí đào tạo.
Điều kiện tiên quyết trước khi cấu hình
Để thực hiện thành công bài hướng dẫn này, hệ thống của bạn cần chuẩn bị sẵn các thành phần sau:
- Một máy chủ VPS (Ubuntu/Debian) đã cài đặt sẵn Gitea (phiên bản 1.19 trở lên) và Docker.
- Gitea Actions Runner (Act Runner) đã được cài đặt và kích hoạt thành công trên VPS.
- Một tài khoản GitHub và một Personal Access Token (PAT) có quyền
write:packagesvàread:packagesđể tiến hành xác thực với GHCR.
Bước 1: Khởi tạo Personal Access Token (PAT) trên GitHub
Để Gitea Actions trên VPS có quyền đẩy Docker Image lên GHCR, bạn cần cấp quyền thông qua PAT. Hãy thực hiện các bước sau trên GitHub:
- Truy cập vào tài khoản GitHub của bạn, đi đến Settings > Developer settings > Personal Access Tokens > Tokens (classic).
- Chọn Generate new token (classic).
- Đặt tên cho Token (ví dụ:
Gitea-VPS-to-GHCR) và chọn thời gian hết hạn (Expiration). - Đánh dấu chọn vào quyền write:packages (quyền
repovàread:packagessẽ tự động được chọn). - Nhấn Generate token và sao chép mã token này lại. Lưu ý: Mã này chỉ hiển thị một lần duy nhất.
Bước 2: Cấu hình Secrets an toàn trong Repository Gitea
Tuyệt đối không được viết trực tiếp mật khẩu hoặc Token vào file cấu hình YAML. Gitea cung cấp tính năng Secrets để mã hóa và bảo vệ các thông tin nhạy cảm này.
Hãy truy cập vào Repository của bạn trên Gitea, chọn Settings > Actions > Secrets và thêm hai biến sau:
GHCR_USERNAME: Tên đăng nhập tài khoản GitHub của bạn (viết thường).GHCR_TOKEN: Chuỗi Personal Access Token (PAT) vừa khởi tạo ở Bước 1.
Bước 3: Xây dựng file cấu hình Workflow YAML
Trong thư mục gốc của dự án trên Gitea, hãy tạo một thư mục có cấu trúc .gitea/workflows/ và tạo một file mới tên là build-push-ghcr.yaml. Đây là nơi chúng ta định nghĩa toàn bộ kịch bản CI/CD.
Dưới đây là mẫu cấu hình chuẩn hóa dành cho môi trường doanh nghiệp:
name: Build and Push Docker Image to GHCR
on:
push:
branches:
- main
tags:
- 'v*'
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Log in to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ secrets.GHCR_USERNAME }}
password: ${{ secrets.GHCR_TOKEN }}
- name: Extract Metadata for Docker
id: meta
uses: docker/metadata-action@v4
with:
images: ghcr.io/${{ secrets.GHCR_USERNAME }}/my-app
tags: |
type=ref,event=branch
type=semver,pattern={{version}}
latest
- name: Build and Push Docker Image
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=maxGiải thích các thành phần quan trọng trong Workflow:---
• on: push: Kích hoạt workflow khi có hành động push code lên nhánhmainhoặc khi tạo tag phiên bản mới (ví dụ: v1.0.0).
• docker/login-action: Thực hiện đăng nhập an toàn vào hệ thốngghcr.iobằng cách sử dụng các Secrets đã cấu hình ở Bước 2.
• docker/metadata-action: Tự động phân tích và gắn thẻ (tag) cho Docker Image (như taglatesthoặc theo số phiên bản của Git).
• cache-from / cache-to: Cấu hình cơ chế lưu bộ nhớ đệm (Cache) giúp tăng tốc độ build cho những lần tiếp theo lên gấp 5-10 lần.
Bước 4: Kiểm tra và Vận hành Hệ thống
Sau khi đã chuẩn bị xong file cấu hình và Dockerfile cho ứng dụng của bạn, hãy thực hiện lệnh git commit và git push lên Gitea Server:
git add .
git commit -m "feat: tích hợp Gitea Actions build Docker"
git push origin mainNgay lập tức, bạn có thể chuyển sang giao diện Web của Gitea, vào tab Actions để theo dõi trực quan quá trình thực thi từng bước (Step-by-step). Nếu cấu hình chính xác, tất cả các bước sẽ hiển thị tích xanh thành công.
Cuối cùng, hãy truy cập vào mục Packages trên trang cá nhân hoặc Organization của bạn trên GitHub để kiểm tra Docker Image mới đã được đẩy lên thành công.
---Những lưu ý bảo mật và tối ưu hiệu năng khi chạy trên VPS
Khi tự vận hành hệ thống CI/CD trên máy chủ riêng, doanh nghiệp cần lưu ý một số điểm mấu chốt sau để đảm bảo tính ổn định và an toàn:
- Giới hạn tài nguyên của Act Runner: Mặc định, quá trình build Docker có thể ngốn rất nhiều CPU và RAM của VPS. Bạn nên cấu hình giới hạn tài nguyên (Docker cgroups) cho Gitea Runner để tránh làm ảnh hưởng đến các ứng dụng khác đang chạy trên cùng server.
- Dọn dẹp Docker dữ liệu rác (Garbage Collection): Quá trình build liên tục sẽ sinh ra các layer thừa (dangling images). Hãy thiết lập một cronjob định kỳ trên VPS để chạy lệnh
docker system prune -fnhằm giải phóng ổ cứng. - Bảo mật Runner: Luôn chạy Act Runner dưới quyền một user hạn chế, không sử dụng quyền
roottrực tiếp của hệ thống để giảm thiểu rủi ro bị tấn công leo thang đặc quyền qua container.
Kết luận
Xây dựng một hệ thống CI/CD khép kín và tự chủ với Gitea Actions hướng tới GitHub Container Registry là phương án cân bằng hoàn hảo giữa tính linh hoạt, tính kinh tế và hiệu suất quản trị hạ tầng. Nó giải phóng các kỹ sư phần mềm khỏi những tác vụ thủ công, đảm bảo mọi commit code đều được đóng gói chuẩn hóa và sẵn sàng triển khai lên môi trường Production một cách nhanh chóng và an toàn nhất.
