Cài đặt Woodpecker CI trên Fedora Server: Giải pháp CI/CD “nhẹ cân” cho Gitea

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

Woodpecker CI: Khi Jenkins quá “ngốn” tài nguyên so với nhu cầu

Nếu bạn đang vận hành một con VPS cấu hình khiêm tốn (ví dụ 2 vCPU và 2GB RAM), việc cài đặt Jenkins chẳng khác nào một cơn ác mộng. Jenkins chạy trên Java thường chiếm dụng ít nhất 1GB RAM ngay khi vừa khởi động. Với các dự án nhỏ, chỉ cần build Docker image hoặc deploy web tĩnh, Woodpecker CI là lựa chọn thay thế thông minh hơn nhiều. Mình đã chạy Fedora Server cho các dự án cá nhân hơn 2 năm và nhận thấy Woodpecker CI chính là mảnh ghép còn thiếu để tối ưu quy trình DevOps.

Woodpecker kế thừa những gì tốt nhất từ Drone CI thời còn mã nguồn mở hoàn toàn. Viết bằng ngôn ngữ Go, hệ thống này hoạt động cực kỳ mượt mà dưới dạng container và có khả năng “bắt cặp” rất nhanh với Gitea.

So sánh thực tế: Tại sao nên chọn Woodpecker?

Trước khi bắt tay vào cấu hình, hãy nhìn vào con số thực tế để thấy sự khác biệt giữa các công cụ phổ biến:

  • Jenkins: Đầy đủ tính năng nhưng nặng nề. Yêu cầu tối thiểu 2GB RAM để chạy ổn định. Cấu hình Groovy Pipeline khá phức tạp với người mới.
  • GitLab CI: Tuyệt vời nhưng đi kèm với bộ source GitLab khổng lồ. Nếu tự host, bạn cần ít nhất 4GB-8GB RAM cho cả hệ thống.
  • GitHub Actions: Tiện lợi nhưng phụ thuộc hoàn toàn vào cloud. Bạn sẽ gặp khó khăn nếu muốn triển khai on-premise để bảo mật code nội bộ.
  • Woodpecker CI: Sử dụng YAML (tương tự GitHub Actions). Woodpecker Server chỉ tiêu tốn khoảng 100MB – 200MB RAM. Đây là con số cực kỳ lý tưởng cho server cấu hình thấp.

Ưu và nhược điểm cần lưu ý

Điểm cộng:

  • Khởi động gần như tức thì.
  • Mã nguồn mở hoàn toàn (Apache 2.0), không lo bị giới hạn tính năng trả phí.
  • Cấu hình Pipeline qua file .woodpecker.yml rất trực quan.
  • Hỗ trợ tốt cho Gitea, Forgejo, GitHub và GitLab.

Hạn chế:

  • Số lượng plugin ít hơn Jenkins. Tuy nhiên, nó vẫn đáp ứng tốt 95% nhu cầu build/deploy thông thường.
  • Cộng đồng hỗ trợ tại Việt Nam chưa đông đảo.

Sức mạnh khi kết hợp Fedora Server và Woodpecker

Fedora Server luôn đi đầu với Kernel mới và tích hợp sẵn Podman. Thay vì dùng Docker, Podman trên Fedora mang lại cơ chế bảo mật tốt hơn thông qua SELinux. Khi triển khai Woodpecker trên nền tảng này, bạn sẽ tận dụng được sự ổn định của các bản build container mới nhất mà không cần tốn công tinh chỉnh quá nhiều.

Bước 1: Thiết lập OAuth Application trên Gitea

Để Woodpecker có thể truy cập vào repository, bạn cần tạo một cầu nối bảo mật trên Gitea:

  1. Truy cập Gitea, vào Settings -> Applications.
  2. Tại mục Manage OAuth2 Applications, đặt tên ứng dụng là Woodpecker CI.
  3. Redirect URI: Nhập địa chỉ server của bạn theo định dạng: https://ci.yourdomain.com/authorize.
  4. Sau khi nhấn Create Application, hãy copy Client IDClient Secret vào một file note. Chúng ta sẽ cần chúng ở bước cấu hình server.

Bước 2: Chuẩn bị môi trường Podman trên Fedora

Fedora Server đã có sẵn Podman, nhưng chúng ta cần thêm podman-compose và kích hoạt socket để Agent có thể giao tiếp với hệ thống.

sudo dnf update -y
sudo dnf install podman podman-compose -y

# Kích hoạt socket để Woodpecker Agent có quyền tạo container build
sudo systemctl enable --now podman.socket

Kiểm tra trạng thái socket bằng lệnh: ls -al /run/podman/podman.sock. Nếu thấy file socket xuất hiện là bạn đã thành công.

Bước 3: Triển khai Woodpecker bằng Podman Compose

Chúng ta sẽ gom cả Server và Agent vào một file duy nhất để dễ quản lý. Hãy tạo thư mục làm việc:

mkdir ~/woodpecker && cd ~/woodpecker
nano docker-compose.yml

Dán nội dung cấu hình sau vào file. Lưu ý thay đổi các biến môi trường cho đúng với thông tin OAuth bạn vừa khởi tạo:

version: '3'

services:
  woodpecker-server:
    image: woodpeckerci/woodpecker-server:latest
    volumes:
      - ./woodpecker-data:/var/lib/woodpecker/
    environment:
      - WOODPECKER_GITEA=true
      - WOODPECKER_GITEA_URL=https://git.yourdomain.com
      - WOODPECKER_GITEA_CLIENT=YOUR_CLIENT_ID
      - WOODPECKER_GITEA_SECRET=YOUR_CLIENT_SECRET
      - WOODPECKER_SERVER_ADDR=:8000
      - WOODPECKER_AGENT_SECRET=chuoi_random_bao_mat_cua_ban
    ports:
      - 8000:8000
    restart: always

  woodpecker-agent:
    image: woodpeckerci/woodpecker-agent:latest
    command: agent
    volumes:
      - /run/podman/podman.sock:/var/run/docker.sock
    environment:
      - WOODPECKER_SERVER=woodpecker-server:9000
      - WOODPECKER_AGENT_SECRET=chuoi_random_bao_mat_cua_ban
      - WOODPECKER_BACKEND=docker
    restart: always
    depends_on:
      - woodpecker-server

Mẹo nhỏ về SELinux: Fedora rất nghiêm ngặt về quyền truy cập socket. Nếu gặp lỗi Permission Denied, hãy chạy lệnh sau để cho phép container quản lý cgroup:

sudo setsebool -P container_manage_cgroup on

Kích hoạt hệ thống bằng lệnh: podman-compose up -d.

Bước 4: Kích hoạt Pipeline cho dự án

Mở trình duyệt và truy cập vào cổng 8000 của server. Đăng nhập thông qua tài khoản Gitea của bạn. Tại giao diện điều khiển, bạn sẽ thấy toàn bộ repository hiện có.

Chỉ cần nhấn Enable tại repo mong muốn. Woodpecker sẽ tự động thiết lập Webhook phía Gitea. Từ giây phút này, mỗi khi bạn push code, một quy trình build sẽ tự động bắt đầu.

Bước 5: Tạo file định nghĩa Pipeline mẫu

Hãy tạo file .woodpecker.yml tại thư mục gốc của project Node.js để kiểm tra tính năng:

pipeline:
  test:
    image: node:18-alpine
    commands:
      - npm install
      - npm test

  build-image:
    image: plugins/docker
    settings:
      repo: registry.yourdomain.com/my-app
      registry: registry.yourdomain.com
      username:
        from_secret: docker_user
      password:
        from_secret: docker_pass
    when:
      event: push
      branch: main

Khi đẩy file này lên nhánh main, Woodpecker Agent sẽ tự động kéo image Node.js về để chạy test. Nếu mọi thứ ổn định, nó sẽ tiếp tục build và đẩy image lên registry của bạn.

Kinh nghiệm vận hành thực tế

Sau một thời gian sử dụng Woodpecker trên Fedora, mình đúc kết được 3 lưu ý quan trọng:

  1. Giải phóng ổ cứng: Các container build thường để lại image thừa. Bạn nên đặt cronjob chạy podman image prune -f hàng tuần để tránh đầy bộ nhớ.
  2. Bảo mật Secret: Tuyệt đối không ghi mật khẩu trực tiếp vào file YAML. Hãy sử dụng tính năng Secrets trong phần cài đặt Repo trên giao diện Web của Woodpecker.
  3. Tăng tốc build bằng Cache: Với các dự án lớn, hãy sử dụng plugin cache để lưu lại thư mục node_modules hoặc vendor. Việc này có thể giảm thời gian build từ 5 phút xuống còn chưa đầy 1 phút.

Sự kết hợp giữa Woodpecker CI và Fedora Server mang lại một môi trường DevOps cực kỳ chuyên nghiệp với chi phí vận hành gần như bằng không. Chúc các bạn cài đặt thành công!

Share: