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¶
- Overview
- Workflow CI/CD
- Jobs dan Validasi
- Cara Menggunakan
- Setup Deployment Otomatis
- Troubleshooting
- 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?¶
- Continuous Integration (CI) - Otomatis validasi kode setiap push/PR:
- Linting dengan flake8
- Syntax check Python
- Validasi manifest modul
- Validasi file XML
- Validasi file CSV security
-
Test struktur modul
-
Continuous Deployment (CD) - Deploy otomatis ke production (jika diaktifkan):
- Sync file ke server via rsync
- Update modul Odoo
- 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:
- mendeteksi modul
scola_*yang berubah, - meng-upgrade modul yang relevan dengan
--stop-after-init, - me-restart service
odoo-devscola, - menjalankan health check lokal ke Odoo.
Khusus domain absensi:
- jika
scola_attendanceberubah, workflow juga akan menambahkanscola_hr_attendanceke daftar upgrade, - jika
scola_hr_attendanceberubah, workflow juga akan menambahkanscola_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_attendancesendirian 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:
-
Set Repository Variables
gh variable set DEPLOY_ENABLED --body "true" \ --repo Gema-Cendekia-Gemilang/scola-odoo-module -
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 -
Setup Environment (untuk approval flow)
- Buka https://github.com/Gema-Cendekia-Gemilang/scola-odoo-module/settings/environments
- Buat environment
production - (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¶
- Buat branch dari
main - Develop dan commit
- Push branch
- Buat Pull Request
- Tunggu CI pass
- 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