Lewati ke isi

Panduan Setup CI/CD Backend Odoo - GCG Scola

Dokumen ini berisi panduan lengkap setup dan penggunaan CI/CD untuk backend Odoo GCG Scola


📚 Daftar Isi

  1. Overview
  2. Workflow CI/CD
  3. Jobs dan Validasi
  4. Cara Menggunakan
  5. Setup Deployment Otomatis
  6. Troubleshooting
  7. Best Practices

1. Overview {#overview}

Repository Information

Item Value
Repository Gema-Cendekia-Gemilang/scola-odoo-module
URL https://github.com/Gema-Cendekia-Gemilang/scola-odoo-module
Branch Utama main
Workflow File .github/workflows/odoo-deploy.yml

Apa yang Dilakukan CI/CD Ini?

  1. Continuous Integration (CI) - Otomatis validasi kode setiap push/PR:
  2. Linting dengan flake8
  3. Syntax check Python
  4. Validasi manifest modul
  5. Validasi file XML
  6. Validasi file CSV security
  7. Test struktur modul

  8. Continuous Deployment (CD) - Deploy otomatis ke production (jika diaktifkan):

  9. Sync file ke server via rsync
  10. Update modul Odoo
  11. Health check

2. Workflow CI/CD {#workflow-cicd}

Diagram Alur

┌──────────────────────────────────────────────────────────────────────────┐
│                            Trigger Events                                 │
│   ┌─────────┐    ┌─────────────┐    ┌───────────────────┐               │
│   │  Push   │    │Pull Request │    │ Manual Dispatch   │               │
│   │ (main)  │    │   (main)    │    │   (workflow_      │               │
│   └────┬────┘    └──────┬──────┘    │    dispatch)      │               │
│        │                │           └─────────┬─────────┘               │
│        └───────────┬────┴───────────────────┬─┘                         │
│                    ▼                                                     │
└──────────────────────────────────────────────────────────────────────────┘
                     │
                     ▼
┌──────────────────────────────────────────────────────────────────────────┐
│                    Stage 1: Parallel Validation                          │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────┐  ┌─────────────────────┐ │
│  │    Lint &   │  │  Validate   │  │  Check  │  │   Check CSV         │ │
│  │   Syntax    │  │  Manifests  │  │   XML   │  │   Security          │ │
│  │   Check     │  │             │  │         │  │                     │ │
│  └──────┬──────┘  └──────┬──────┘  └────┬────┘  └──────────┬──────────┘ │
│         │                │              │                   │            │
│         └────────────────┴──────────────┴──────────────────┘            │
└──────────────────────────────────────────────────────────────────────────┘
                     │
                     ▼
┌──────────────────────────────────────────────────────────────────────────┐
│                    Stage 2: Test                                         │
│  ┌────────────────────────────────────────────────────────────────────┐ │
│  │              Module Syntax Validation                              │ │
│  │  • Test Python syntax per modul                                    │ │
│  │  • Validasi struktur direktori                                     │ │
│  │  • Cek __init__.py                                                 │ │
│  └────────────────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────────┘
                     │
                     ▼
┌──────────────────────────────────────────────────────────────────────────┐
│  Stage 3: Deploy (Hanya jika DEPLOY_ENABLED=true & branch=main)         │
│  ┌───────────────┐  ┌─────────────────────┐  ┌──────────────────────┐   │
│  │  Git Pull     │─▶│  Tampilkan Info     │─▶│   Health Check       │   │
│  │  pada Server  │  │  Modul & Instruksi  │  │   (cek proses Odoo)  │   │
│  └───────────────┘  └─────────────────────┘  └──────────────────────┘   │
└──────────────────────────────────────────────────────────────────────────┘
                     │
                     ▼
┌──────────────────────────────────────────────────────────────────────────┐
│                    Stage 4: Notify                                       │
│  ┌────────────────────────────────────────────────────────────────────┐ │
│  │              Send Notification (Success/Failure)                   │ │
│  └────────────────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────────┘

Catatan Penting: Auto-Upgrade + Restart Sudah Ditangani Workflow

Workflow backend odoo-deploy.yml sekarang tidak berhenti di sync kode. Untuk push ke main atau workflow_dispatch, pipeline akan:

  1. mendeteksi modul scola_* yang berubah,
  2. meng-upgrade modul yang relevan dengan --stop-after-init,
  3. me-restart service odoo-devscola,
  4. menjalankan health check lokal ke Odoo.

Khusus domain absensi:

  • jika scola_attendance berubah, workflow juga akan menambahkan scola_hr_attendance ke daftar upgrade,
  • jika scola_hr_attendance berubah, workflow juga akan menambahkan scola_attendance,
  • tujuan pasangan upgrade ini adalah menjaga kontrak RFID + self-attendance staf tetap sinkron setelah perubahan manifest, model, controller, atau security.

Kapan Tetap Perlu Intervensi Manual

Lakukan langkah manual hanya jika:

  • workflow gagal sebelum tahap Upgrade changed modules,
  • server sedang maintenance dan deploy otomatis dinonaktifkan,
  • Anda perlu dry-run upgrade lokal/staging sebelum merge ke main.

Override Manual di Server

sudo systemctl stop odoo-devscola
/home/scola/odoo/odoo-bin \
  -c /home/scola/odoo/odoo-devscola.conf \
  -d scoladev \
  -u scola_hr_attendance,scola_attendance \
  --stop-after-init
sudo systemctl start odoo-devscola

Tip: untuk modul absensi, jangan upgrade scola_attendance sendirian jika perubahan menyentuh dependency, security, atau self-attendance staf.

Trigger Events

Event Kondisi Aksi
push Ke branch main atau master Jalankan CI/CD
pull_request Target branch main atau master Jalankan CI (tanpa deploy)
workflow_dispatch Manual trigger Pilih modul untuk diupdate

3. Jobs dan Validasi {#jobs-dan-validasi}

Job 1: Lint & Syntax Check

Durasi: ~15 detik

tools:
  - flake8 (check E9, F63, F7, F82)
  - py_compile

checks:
  - Error syntax Python
  - Undefined variables
  - Import errors

Error yang dicek: - E9 - Runtime errors (syntax errors) - F63 - Invalid print function - F7 - Syntax error in type comments - F82 - Undefined names

Job 2: Validate Module Manifests

Durasi: ~5 detik

required_fields = ['name', 'version', 'depends']

Validasi: - File __manifest__.py harus valid Python dict - Field wajib harus ada - Version tidak boleh kosong

Job 3: Validate XML Files

Durasi: ~25 detik

xmllint --noout *.xml

Validasi: - Semua file XML harus well-formed - Tidak ada tag yang tidak tertutup - Encoding yang benar

Job 4: Validate CSV Security Files

Durasi: ~5 detik

File yang dicek: ir.model.access.csv

Required headers:

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink

Job 5: Module Syntax Validation

Durasi: ~15 detik

Dependencies installed:

lxml, psycopg2-binary, python-dateutil, pytz

Validasi: - Python syntax per modul scola_* - Struktur folder (harus ada __init__.py) - Security folder (jika direferensikan di manifest)

Job 6: Deploy to Production

Durasi: Variable (~2-5 menit)

Kondisi: Hanya jalan jika: 1. Branch = main 2. Event = push 3. Variable DEPLOY_ENABLED = true

Langkah: 1. Sync file via rsync ke server 2. Backup database 3. Stop Odoo 4. Update modul 5. Start Odoo 6. Health check


4. Cara Menggunakan {#cara-menggunakan}

Workflow Otomatis (Push)

Setiap kali Anda push ke branch main:

git add .
git commit -m "feat: Add new feature"
git push origin main

Workflow akan otomatis berjalan dan dapat dimonitor di: - GitHub Web: https://github.com/Gema-Cendekia-Gemilang/scola-odoo-module/actions - Terminal (gh CLI):

gh run list --repo Gema-Cendekia-Gemilang/scola-odoo-module --limit 5
gh run watch <run_id> --repo Gema-Cendekia-Gemilang/scola-odoo-module

Manual Trigger dengan Modul Tertentu

# Via gh CLI
gh workflow run "Odoo Module CI/CD" \
  --repo Gema-Cendekia-Gemilang/scola-odoo-module \
  --field modules="scola_core,scola_parent"

# Monitor
gh run list --repo Gema-Cendekia-Gemilang/scola-odoo-module --limit 1

Lihat Log Workflow

# Lihat semua runs
gh run list --repo Gema-Cendekia-Gemilang/scola-odoo-module

# Lihat detail run
gh run view <run_id> --repo Gema-Cendekia-Gemilang/scola-odoo-module

# Lihat log job tertentu
gh run view <run_id> --repo Gema-Cendekia-Gemilang/scola-odoo-module --log

5. Setup Deployment Otomatis {#setup-deployment-otomatis}

Prerequisites

Untuk mengaktifkan deployment otomatis ke production, Anda perlu:

  1. Set Repository Variables

    gh variable set DEPLOY_ENABLED --body "true" \
      --repo Gema-Cendekia-Gemilang/scola-odoo-module
    

  2. Set Repository Secrets

    # SSH Private Key untuk akses server
    gh secret set SSH_PRIVATE_KEY --repo Gema-Cendekia-Gemilang/scola-odoo-module < ~/.ssh/id_ed25519
    
    # Hostname server
    gh secret set SSH_HOST --body "89.116.32.154" \
      --repo Gema-Cendekia-Gemilang/scola-odoo-module
    
    # Username SSH
    gh secret set SSH_USER --body "scola" \
      --repo Gema-Cendekia-Gemilang/scola-odoo-module
    
    # Path addons di server
    gh secret set ODOO_ADDONS_PATH --body "/home/scola/odoo/custom_addons_scola" \
      --repo Gema-Cendekia-Gemilang/scola-odoo-module
    
    # Nama database
    gh secret set ODOO_DB_NAME --body "scola_devscola" \
      --repo Gema-Cendekia-Gemilang/scola-odoo-module
    
    # URL Odoo untuk health check
    gh secret set ODOO_URL --body "https://devscola.gcgscola.id" \
      --repo Gema-Cendekia-Gemilang/scola-odoo-module
    

  3. Setup Environment (untuk approval flow)

  4. Buka https://github.com/Gema-Cendekia-Gemilang/scola-odoo-module/settings/environments
  5. Buat environment production
  6. (Opsional) Tambahkan required reviewers

Deployment Secrets Required

Secret Deskripsi Contoh
SSH_PRIVATE_KEY Private key SSH Isi dari ~/.ssh/id_ed25519
SSH_HOST IP/Hostname server 89.116.32.154
SSH_USER Username SSH scola
ODOO_ADDONS_PATH Path custom addons /home/scola/odoo/custom_addons_scola
ODOO_DB_NAME Nama database scola_devscola
ODOO_URL URL untuk health check https://devscola.gcgscola.id

6. Troubleshooting {#troubleshooting}

Workflow Gagal di Lint

Penyebab umum: - Syntax error Python - Import yang tidak ada - Variable undefined

Solusi:

# Test lokal
flake8 . --select=E9,F63,F7,F82 --exclude=.git

# Cek syntax
python -m py_compile path/to/file.py

Workflow Gagal di XML Validation

Penyebab umum: - Tag tidak tertutup - Karakter special tidak di-escape - Encoding error

Solusi:

# Install xmllint
sudo apt-get install libxml2-utils

# Validate
xmllint --noout path/to/file.xml

Workflow Gagal di Manifest Validation

Penyebab umum: - Field name, version, atau depends tidak ada - Syntax error di __manifest__.py

Solusi:

# Cek manifest
python -c "
import ast
with open('__manifest__.py') as f:
    manifest = ast.literal_eval(f.read())
    print(manifest.keys())
"

Workflow Gagal di Deploy

Penyebab umum: - SSH key tidak valid - Server tidak reachable - Odoo service error

Solusi:

# Test SSH
ssh -T user@server

# Cek Odoo log
ssh user@server 'tail -50 /var/log/odoo/odoo.log'


7. Best Practices {#best-practices}

1. Commit Message Convention

Gunakan format Conventional Commits:

<type>(<scope>): <description>

[optional body]

[optional footer]

Types: - feat: Fitur baru - fix: Bug fix - docs: Dokumentasi - refactor: Refactoring kode - test: Testing - chore: Maintenance

Contoh:

feat(scola_cbt): Add question bank import from CSV
fix(scola_fees): Fix calculation error on discount
docs(README): Update installation instructions

2. Branch Strategy

main
  └── feature/scola_admission_new     # Feature branch
  └── fix/scola_fees_calculation      # Bugfix branch
  └── refactor/scola_core_cleanup     # Refactoring branch

3. Pull Request Workflow

  1. Buat branch dari main
  2. Develop dan commit
  3. Push branch
  4. Buat Pull Request
  5. Tunggu CI pass
  6. Review dan merge

4. Testing Lokal Sebelum Push

# 1. Lint check
flake8 . --select=E9,F63,F7,F82 --exclude=.git

# 2. Syntax check
find . -name "*.py" -exec python -m py_compile {} \;

# 3. XML check
find . -name "*.xml" -exec xmllint --noout {} \;

# 4. Update modul di Odoo lokal
./odoo-bin -c config.conf -d devscola -u module_name --stop-after-init

📎 Quick Reference

Perintah gh CLI Penting

# Login ke GitHub
gh auth login

# Lihat status autentikasi
gh auth status

# Lihat workflow runs
gh run list --repo Gema-Cendekia-Gemilang/scola-odoo-module

# Watch workflow run
gh run watch <run_id> --repo Gema-Cendekia-Gemilang/scola-odoo-module

# Manual trigger workflow
gh workflow run "Odoo Module CI/CD" \
  --repo Gema-Cendekia-Gemilang/scola-odoo-module

# Set variable
gh variable set DEPLOY_ENABLED --body "true" \
  --repo Gema-Cendekia-Gemilang/scola-odoo-module

# Set secret
gh secret set SECRET_NAME --body "value" \
  --repo Gema-Cendekia-Gemilang/scola-odoo-module

Dokumen ini dibuat untuk pembelajaran internal tim development GCG Scola Terakhir diperbarui: 2026-01-11