GitHub Actions memang tools CI/CD paling populer di dunia dengan integrasi native ke GitHub, marketplace action yang lengkap, dan workflow file yang mudah dibaca. Namun ada masalah yang jarang dibahas: biaya. Untuk private repository, GitHub memberikan 2.000 menit gratis per bulan; public repository gratis tanpa batas, tetapi banyak project production — aplikasi klien, side project berbayar, internal tools — harus memakai private repo. Untuk project yang serius dengan multiple branches, frequent builds, dan matrix testing, kuota 2.000 menit itu habis dalam hitungan hari. Di Indonesia, dengan kurs $1 = Rp16.000, biaya GitHub Actions bisa signifikan bagi startup kecil dan freelancer.
Kasus nyatanya: sebuah project kantor menghabiskan hingga $47 per bulan hanya untuk GitHub Actions, belum termasuk storage artifact dan container registry yang juga punya limit. Solusinya adalah self-host CI/CD dengan Gitea Actions — biayanya bisa turun drastis hingga $0. Artikel ini memandu setup Gitea Actions dari nol, termasuk konfigurasi Docker runner yang menjalankan workflow di server sendiri. Yang menarik: Gitea Actions memakai syntax yang identik dengan GitHub Actions, jadi migrasinya drop-in — cukup copy-paste file workflow, ganti trigger dari webhook GitHub ke webhook Gitea, dan workflow langsung jalan.
Kenapa Gitea Actions? CI/CD Self-Hosted yang Sebenarnya Gratis
Gitea Actions adalah alternatif self-hosted untuk GitHub Actions yang menghilangkan biaya per-menit. Keunggulan utamanya ada di tiga hal: kontrol penuh atas infrastruktur runner, tanpa limit menit maupun concurrent job, dan kompatibilitas syntax penuh dengan GitHub Actions sehingga tim tidak perlu belajar workflow baru sama sekali. Semua biaya yang tadinya masuk tagihan cloud dialihkan ke VPS yang sudah dimiliki.
Apa itu Gitea Actions?
Gitea Actions adalah fitur CI/CD bawaan Gitea yang kompatibel dengan syntax GitHub Actions. Artinya, jika sudah punya workflow file untuk GitHub (.github/workflows/*.yml), file tersebut bisa langsung dipakai di Gitea dengan perubahan minimal.
Yang membuat Gitea Actions menarik:
- Gratis tanpa batas — tidak ada menit usage limit
- Syntax kompatibel dengan GitHub Actions — migrasi mudah
- Self-hosted runner — infrastruktur sepenuhnya dikontrol sendiri
- Acts engine — engine yang sama yang digunakan oleh GitHub Actions
- Built-in ke Gitea — tidak perlu install tools tambahan
Prasyarat
- Gitea sudah terinstall dan running (minimal versi 1.21+)
- Docker terinstall di mesin yang sama atau terpisah
- Akses admin ke Gitea instance
Jika belum punya Gitea, berikut quick setup. VPS murah seperti RackNerd sudah cukup untuk menjalankan Gitea beserta runner di skala kecil.
# docker-compose.yml untuk Gitea
version: '3'
services:
gitea:
image: gitea/gitea:latest
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=sqlite3
volumes:
- ./gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "2222:22"
restart: always
docker compose up -d
Step 1: Install Gitea Runner (Docker)
Gitea Runner adalah aplikasi yang menerima job dari Gitea dan menjalankannya. Ada dua mode: Docker runner (recommended) dan binary runner. Panduan ini memakai Docker runner karena lebih isolated.
# Buat direktori untuk runner
mkdir -p /opt/gitea-runner && cd /opt/gitea-runner
# Generate token registration dari Gitea
# Menu: Site Administration → Runners → Create New Runner
# Copy token yang diberikan
# Jalankan runner dengan Docker
docker run -d \
--name gitea-runner \
--restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /opt/gitea-runner/data:/data \
-e GITEA_INSTANCE_URL=http://your-gitea-host:3000 \
-e GITEA_RUNNER_REGISTRATION_TOKEN=YOUR_TOKEN_HERE \
-e GITEA_RUNNER_NAME=main-runner \
-e GITEA_RUNNER_LABELS=ubuntu-latest:docker://node:20-bookworm,ubuntu-22.04:docker://ubuntu:22.04 \
gitea/act_runner:latest
Labels menentukan image Docker yang dipakai untuk setiap runs-on di workflow. Konfigurasi ini bisa di-customize sesuai kebutuhan.
Step 2: Buat Workflow File
Di repo Gitea, buat file .gitea/workflows/ci.yml (atau .github/workflows/ci.yml jika memakai kompatibilitas GitHub):
# .gitea/workflows/ci.yml
name: CI Pipeline
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Run linting
run: npm run lint
build:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install & Build
run: |
npm ci
npm run build
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: build-output
path: dist/
Step 3: Deploy Workflow dengan Docker Compose
Untuk project yang lebih kompleks, runner bisa di-setup dengan Docker Compose yang lebih proper:
# docker-compose.yml untuk Gitea Runner
version: '3.8'
services:
gitea-runner:
image: gitea/act_runner:latest
container_name: gitea-runner
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./data:/data
environment:
- GITEA_INSTANCE_URL=http://gitea:3000
- GITEA_RUNNER_REGISTRATION_TOKEN=${RUNNER_TOKEN}
- GITEA_RUNNER_NAME=prod-runner
- GITEA_RUNNER_LABELS=ubuntu-latest:docker://node:20-bookworm
- GITEA_RUNNER_WORKSPACE=/data/workspace
networks:
- gitea-net
networks:
gitea-net:
external: true
Step 4: Konfigurasi Advanced — Caching & Artifacts
Salah satu concern dengan self-hosted runner adalah caching. Di GitHub Actions, cache disimpan di cloud storage. Di self-hosted, caching ditangani sendiri:
# .gitea/workflows/ci-with-cache.yml
name: CI with Caching
on: push
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# Cache npm dependencies
- name: Cache npm
uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-npm-
- name: Install dependencies
run: npm ci --prefer-offline
- name: Build
run: npm run build
# Simpan build artifacts ke volume bersama
- name: Save build artifacts
run: |
mkdir -p /data/artifacts/${{ github.sha }}
cp -r dist/* /data/artifacts/${{ github.sha }}/
Memigrasikan dari GitHub Actions
Jika sudah punya workflow di GitHub, migrasi ke Gitea Actions cukup mudah:
- Copy seluruh folder
.github/workflows/ke.gitea/workflows/ - Ganti
runs-on: ubuntu-latestjika menggunakan custom runner labels - Ganti action references jika ada yang menggunakan GitHub-specific features
- Test setiap workflow secara individual
Yang perlu diperhatikan:
GITHUB_TOKEN→ diganti denganGITEA_TOKENatau gunakan secrets- GitHub Container Registry → diganti dengan container registry sendiri
- Beberapa actions mungkin belum kompatibel — cek dokumentasi Gitea
Monitoring dan Troubleshooting
# Cek status runner
docker logs gitea-runner --tail 50
# Restart runner jika stuck
docker restart gitea-runner
# Cek jobs yang sedang running
# Menu: Repository → Actions → Jobs
Untuk monitoring yang lebih lengkap, pertimbangkan setup Netdata + Grafana untuk memantau resource usage runner.
Untuk expose Gitea ke internet dengan HTTPS, pasang reverse proxy Nginx:
server {
server_name git.example.com;
listen 80;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Setelah itu aktifkan HTTPS dengan Certbot: sudo certbot --nginx -d git.example.com. Panduan lengkapnya ada di artikel TLS certificate dengan Certbot untuk self-hosted.
Tips Optimasi untuk Self-Hosted Runner
Self-hosted runner punya beberapa optimasi yang bisa di-tweak untuk performance terbaik:
Cache Layer
GitHub Actions punya cache built-in, tapi Gitea perlu setup manual. Gunakan Gitea sendiri sebagai cache backend — simpan artifact ke Gitea release, atau pakai external cache seperti Redis:
- name: Cache node_modules
uses: actions/cache@v3
with:
path: node_modules
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
Multi-Runner Setup
Untuk tim yang lebih besar, deploy multiple runner di beberapa VPS atau VM. Gitea otomatis distribute jobs ke runner yang available. Ini parallelism gratis — tidak ada limit concurrent jobs seperti di GitHub Actions free tier.
Custom Labels untuk Hardware Specific
Bikin runner dengan label khusus untuk hardware tertentu (GPU, RAM besar, ARM):
runs-on: [self-hosted, linux, gpu]
# Hanya jalan di runner yang punya label "gpu"
Pattern ini berguna untuk build yang butuh GPU (misalnya CUDA compilation) atau ARM64 (misalnya Apple Silicon cross-compile).
Security Hardening untuk Gitea
Self-hosted berarti self-managed security. Beberapa hal yang wajib di-setup:
- HTTPS only — pakai Certbot, redirect HTTP ke HTTPS, set header HSTS.
- Disable registration publik — untuk tim internal, disable open registration di admin settings.
- Two-factor authentication — enforce 2FA untuk semua user via admin policy.
- SSH key authentication — disable password login untuk SSH Git access.
- Regular backup — backup data volume /var/lib/gitea secara berkala.
- Update regularly — Gitea rilis update keamanan berkala, jangan skip.
Dengan setup security yang proper, Gitea self-hosted lebih aman dari GitHub-hosted — karena attack surface-nya kecil dan semua komponen dikontrol sendiri.
Use Case Lanjutan: Matrix Builds, Multi-Arch, dan Deployment
Salah satu kekuatan Gitea Actions yang sering di-underestimate: matrix builds yang cost-effective. GitHub Actions free tier membatasi ukuran matrix (misalnya 10 kombinasi), Gitea tidak punya limit:
strategy:
matrix:
node: [16, 18, 20]
os: [ubuntu-latest, windows-latest, macos-latest]
steps:
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
Untuk deployment, Gitea Actions bisa langsung deploy ke VPS via SSH, atau push image Docker ke private registry. Pattern umum:
- name: Deploy to production
uses: appleboy/[email protected]
with:
host: ${{ secrets.PROD_HOST }}
username: ${{ secrets.PROD_USER }}
key: ${{ secrets.PROD_SSH_KEY }}
script: |
cd /opt/myapp
git pull
docker compose restart
Setup ini membentuk full CI/CD pipeline yang powerful dengan biaya infrastruktur minimal — cukup VPS yang sudah ada, plus listrik. Untuk panduan deploy static site ke VPS dengan Nginx dan HTTP/3, lihat artikel deploy static site dengan Nginx + HTTP/3.
Biaya Operasional
| Item | GitHub Actions | Gitea Self-Hosted |
|---|---|---|
| CI/CD minutes | 2000/mo gratis, $0.008/menit setelahnya | Unlimited, $0 |
| Storage artifacts | 500MB gratis | Unlimited (local disk) |
| Container registry | 500MB gratis | Unlimited (local) |
| VPS cost | $0 tambahan | VPS existing |
| Total (5000 min/bulan) | ~$24/bulan | $0 tambahan |
Untuk startup Indonesia yang menjalankan 10-20 builds per hari, Gitea Actions bisa menghemat Rp300.000-500.000 per bulan dibanding GitHub Actions.
Biaya VPS-nya sendiri juga bisa ditekan — sewa VPS murah seperti RackNerd yang harganya mulai puluhan ribu rupiah per bulan, sehingga total biaya operasional tetap mendekati $0.
Kesimpulan
Gitea Actions bukan cuma "GitHub Actions tapi gratis" — ini adalah ekosistem CI/CD self-hosted yang mature dan production-ready, dengan syntax yang familiar, ekosistem action yang kompatibel, dan fleksibilitas yang lebih besar dari platform-hosted. Untuk startup Indonesia dan tim kecil yang ingin kontrol penuh atas infrastruktur dengan budget terbatas, Gitea Actions adalah pilihan yang sangat solid.
Dengan setup yang relatif sederhana, pipeline CI/CD yang scalable bisa dibangun tanpa biaya tambahan. Investasi waktu untuk setup awal akan terbayar lunas dalam hitungan bulan — terutama untuk tim yang sering melakukan deployment dan developer Indonesia yang ingin menekan biaya infrastruktur cloud.
Sumber dan Validasi
Artikel ini disusun berdasarkan dokumentasi resmi Gitea Actions dan GitHub Actions. Angka kuota free tier mengikuti kebijakan resmi masing-masing platform.
- Act Runner — Gitea Documentation
- Quick Start — Gitea Documentation
- GitHub Actions billing — GitHub Docs
- Actions limits — GitHub Docs
- Billing and usage — GitHub Docs
Catatan: Artikel ini disusun berdasarkan dokumentasi resmi Gitea dan GitHub Actions. Angka biaya bersifat estimasi dan mengikuti kebijakan harga masing-masing platform.
💬 Komentar (0)
Belum ada komentar. Jadilah yang pertama! 💬