Tutorial

Go QA12: Protocol-Oriented Programming + Static Analysis di Golang 2026

Go QA12: Protocol-Oriented Programming + Static Analysis di Golang 2026

Kenapa Gitea Actions? CI/CD Self-Hosted yang Sebenarnya Gratis

GitHub Actions memang powerful, tapi ada masalah yang jarang dibahas: biaya. Untuk private repositories, GitHub memberikan 2000 menit gratis per bulan. Tapi untuk project yang serius — dengan multiple branches, build yang sering, dan matrix testing — 2000 menit itu habis dalam hitungan hari. Di Indonesia, dimana $1 = Rp16.000, biaya GitHub Actions bisa jadi signifikan untuk startup kecil.

Ada kasus nyata: $47/bulan habis hanya untuk GitHub Actions di sebuah project kantor. Itu belum termasuk storage artifacts dan container registry. Setelah hitung-hitungan, keputusan jatuh ke self-host CI/CD dengan Gitea Actions — dan biayanya turun drastis.

Artikel ini memandu setup Gitea Actions dari nol, termasuk configuration untuk Docker runner yang bisa menjalankan workflow di server sendiri.

Apa itu Gitea Actions?

Gitea Actions adalah fitur CI/CD bawaan Gitea yang kompatibel dengan syntax GitHub Actions. Artinya, workflow file yang sudah ada untuk GitHub (.github/workflows/*.yml) bisa langsung digunakan 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 terkontrol
  • 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

Kalau Gitea belum terpasang, berikut quick setup:

# 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. Kita pakai 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 apa yang digunakan untuk setiap runs-on di workflow. Label 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 menggunakan 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 perlu di-handle 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

Workflow yang sudah ada di GitHub bisa dimigrasi ke Gitea Actions dengan cukup mudah:

  1. Copy seluruh folder .github/workflows/ ke .gitea/workflows/
  2. Ganti runs-on: ubuntu-latest jika menggunakan custom runner labels
  3. Ganti action references jika ada yang menggunakan GitHub-specific features
  4. Test setiap workflow secara individual

Yang perlu diperhatikan:

  • GITHUB_TOKEN → diganti dengan GITEA_TOKEN atau 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, Netdata + Grafana bisa dipakai untuk memantau resource usage runner.

Biaya Operasional

ItemGitHub ActionsGitea Self-Hosted
CI/CD minutes2000/mo gratis, $0.008/menit setelahnyaUnlimited, $0
Storage artifacts500MB gratisUnlimited (local disk)
Container registry500MB gratisUnlimited (local)
VPS cost$0 tambahanVPS 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.

Catatan: biaya VPS untuk self-hosted bisa ditekan mulai dari VPS murah — untuk dev server atau tim kecil, VPS entry-level sudah cukup menjalankan Gitea + runner sekaligus.

Kesimpulan

Gitea Actions adalah alternatif CI/CD self-hosted yang powerful, gratis, dan kompatibel dengan syntax GitHub Actions. Dengan setup yang relatif sederhana, pipeline CI/CD yang scalable bisa dibangun tanpa biaya tambahan. Investasi waktu untuk setup ini akan terbayar lunas dalam hitungan bulan — terutama untuk tim yang sering melakukan deployment.

Untuk deployment ke production, pertimbangkan juga panduan Gitea Actions untuk pengaturan lanjutan yang lebih mature di use case tertentu.

Baca juga:

Setup Praktis Gitea Actions di VPS

Berikut step-by-step setup Gitea Actions di VPS Ubuntu 22.04 dengan Docker runner. Total waktu setup: 30-45 menit kalau sudah familiar dengan Docker dan Nginx.

Step 1: Install Gitea

Pakai Docker Compose untuk setup yang clean:

# docker-compose.yml
version: "3"
services:
  gitea:
    image: gitea/gitea:1.21
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - GITEA__database__DB_TYPE=sqlite3
      - GITEA__server__DOMAIN=git.example.com
      - GITEA__server__SSH_DOMAIN=git.example.com
    restart: always
    volumes:
      - /var/lib/gitea:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "2222:22"

  runner:
    image: gitea/act_runner:0.2
    container_name: gitea-runner
    depends_on:
      - gitea
    environment:
      - GITEA_INSTANCE_URL=http://gitea:3000
      - GITEA_RUNNER_REGISTRATION_TOKEN=<dari Gitea admin>
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    restart: always

Start services: docker compose up -d. Buka http://localhost:3000, buat akun admin, dan login.

Step 2: Enable Actions di Gitea

Secara default, Actions belum enabled. Enable via admin panel: Site Administration → Actions → Enable. Setelah enable, tab "Actions" muncul di setiap repository.

Step 3: Daftarkan Runner

Pergi ke Site Administration → Actions → Runners → Create new runner. Copy registration token, paste ke docker-compose.yml di GITEA_RUNNER_REGISTRATION_TOKEN. Restart runner container. Kalau sukses, status runner akan berubah jadi "Idle" di Gitea admin.

Step 4: Setup Reverse Proxy dengan Nginx

Untuk expose ke internet dengan HTTPS, pakai Nginx + Certbot (lihat artikel TLS certificate untuk detail setup):

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 setup, enable HTTPS dengan sudo certbot --nginx -d git.example.com. Gitea instance kini berjalan dengan HTTPS.

Step 5: Migrasi Workflow dari GitHub

Yang bikin Gitea Actions menarik: syntax workflow identik dengan GitHub Actions. File .github/workflows/*.yml cukup di-copy ke .gitea/workflows/*.yml di repository Gitea. Trigger otomatis sama: push ke branch, pull request, manual trigger, schedule, dll.

# .gitea/workflows/ci.yml
name: CI
on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run tests
        run: |
          npm install
          npm test
      - name: Build Docker image
        run: docker build -t myapp .

File ini akan jalan di Gitea Actions tanpa modifikasi. Action yang dipakai di GitHub (actions/checkout, actions/setup-node, dll) juga work di Gitea — kebanyakan official action compatible karena pakai Docker container.

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 — save 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 — nggak 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 = self-managed security. Beberapa hal yang wajib di-setup:

  1. HTTPS only — pakai Certbot, redirect HTTP ke HTTPS, set header HSTS.
  2. Disable registration publik — kalau ini untuk tim internal, disable open registration di admin settings.
  3. Two-factor authentication — enforce 2FA untuk semua user via admin policy.
  4. SSH key authentication — disable password login untuk SSH Git access.
  5. Regular backup — backup data volume /var/lib/gitea secara berkala.
  6. 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 bisa dikontrol.

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 limit matrix size (misalnya 10 kombinasi), Gitea nggak ada 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 bikin full CI/CD pipeline yang powerful dengan biaya infrastructure yang minimal — cukup VPS yang sudah ada, plus listrik. ROI-nya immediate untuk tim kecil yang sering deploy.

Kesimpulan Akhir

Gitea Actions itu 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 infrastructure dengan budget terbatas, Gitea Actions adalah pilihan yang sangat solid. Setup awal memang butuh waktu, tapi setelah jalan, biaya operasional turun ke hampir $0, tanpa perlu khawatir soal rate limit atau billing surprises.

Buat yang belum punya VPS, mulai dari VPS murah dulu — setelah pipeline jalan, biaya operasional turun ke hampir $0 tanpa rate limit atau billing surprises.

Rekomendasi Tools & Layanan

Mau langsung nyobain AI yang dibahas di artikel ini tanpa setup ribet? AI token plan Alibaba Cloud ngasih akses ke Qwen, DeepSeek, dan model lain lewat satu API — dan platform Qwen buat build agent sendiri. Free tier-nya cukup buat eksperimen pertama.

💬 Komentar (0)

Belum ada komentar. Jadilah yang pertama! 💬

Komentar akan muncul setelah moderasi.