Streamline proses debugging dengan Debugpy Pada Odoo Container

Galih Fikran
4 min readAug 31, 2024

--

Terahir update 01 September 2024 Oleh Galih Fikran.

Menarik sekali Saya pikir ketika menggunakan debugpy untuk melakukan debugging pada framework odoo. Gampangnya, Debugpy adalah paket yang disediakan python untuk memudahkan software engineer dalam melakukan proses debuging. Mudah sekali membuat debugpy bekerja pada odoo yang diinstall secara langsung tanpa menggunakan container. Namun bagaimana ketika menggunakan docker? Masalah ini sebetulnya tidak hanya untuk framework odoo saja. Namun Saya khususkan untuk pembahasan ini studi kasusnya adalah menggunakan framework odoo.

Odoo merupakan framework yang cukup berat pada proses development. Fitur Odoo ORM mewajibkan segala perubahan perlu dilakukan restart karena pada saat restart ORM akan melakukan pengecekan terhadap perubahan field pada source code dan akan melakukan trigger untuk pembaruan struktur tabel pada database. Belum lagi harus melakukan upgrade pada module untuk menerapkan perubahan yang alasanya-pun Saya tak begitu paham. Tentunya ini sangat merepotkan dan buang-buang waktu. Proses development yang harusnya berfokus pada penulisan code dan penyelesaian masalah malah sebagian waktunya dihabiskan untuk menunggu animasi loading selesai pada layar komputer.

Debugpy sebetulnya tidak mengatasi semua masalah diatas karena melakukan restart pada saat perubahan field merupakan suatu kewajiban, hanya saja proses pencarian & penyelesaian bug bisa lebih mudah dan efisien. Contohnya ketika nilai kembalian pada sebuah method ternyata tidak sesuai dengan harapan menyebabkan logical fallacy pada method selanjutnya maka biasanya kami menuliskan logger.

import logging
_logger = logging.getLogger(__name__)

def _order_qty_line_count(self):
# tampilkan informasi pada log
_logger.info(order.qty_order - (sum(osl.mapped('qty_receipt')) + order.qty_receipt))

VsCode menjadi alat bantu kedua yang tangguh itu karena fitur breakpoint menjadi backbone yang mengatur execution process. Mekanismenya hampir sama seperti sys.exit() pada python, system akan menghentikan proses eksekusi pada point yang sudah ditentukan. Saat sistem berhenti pada baris code tertentu maka engineer dapat dengan mudah melakukan pengecekan terhadap fungsi, method, variable secara langsung tanpa harus melakukan restart hanya sekedar untuk menulis logger pada line yang bermasalah.

Tahap Instalasi

1. Setup docker compose

version: '3.8'

services:
odoo-lab:
container_name: odoo-lab
platform: linux/amd64
build:
context: .
dockerfile: Dockerfile
ports:
- "8888:3001" # Port untuk debugpy
- "8879:8069" # Port untuk Odoo
volumes:
- odoo-data-lib:/var/lib/odoo
networks:
- db_odoo-nw
restart: always

networks:
db_odoo-nw:
external: true
volumes:
odoo-data-lib:

Poinya terletak pada port tambahan yang digunakan oleh debugpy yaitu “8888:3001”. Namun pastikan service database sudah teman-teman siapkan ya supaya odoo dapat berjalan dengan baik. Yang ingin saya tekankan disini hanyalah mapping port dari container ke host untuk odoo dan debugpy. Selebihnya silahkan sesuaikan dengan kebutuhan teman-teman.

2. Setup dockerfile

# Menggunakan image Odoo sebagai base image
FROM odoo:15.0

# Install debugpy menggunakan pip
RUN pip3 install debugpy

# Expose the debug port
EXPOSE 3001

# Perintah untuk menjalankan Odoo dengan debugging
CMD ["/usr/bin/python3", "-m", "debugpy", "--listen", "0.0.0.0:3001", "/usr/bin/odoo", "--db_user=odoolab", "--db_host=db", "--db_password=odoolab"]

Debugpy berjalan pada port 3001. Perintah EXPOSE digunakan untuk membuat instruksi kepada docker supaya mendengarkan proses yang berjalan pada port 3001.

3. Setup launch.json

{
"version": "0.2.0",
"configurations": [
{
"name": "Odoo: Attach",
"type": "python",
"request": "attach",
"port": 8888, // port for debugpy inside Docker
"host": "localhost",
"pathMappings": [
{
"localRoot": "${workspaceFolder}/extra-addons", // Local path to your custom addons
"remoteRoot": "/home/extra-addons" // Path to custom addons inside Docker
},
],
"logToFile": true,
"justMyCode": false // Set to false if you want to debug Odoo's internal code as well
}
]
}

Perlu diperhatikan, file ini harus dibuat pada root folder saat teman-teman membuka project dengan VsCode dan diletakan didalam folder “.vscode” (.vscode/launch.json). Sesuakian port debugpy yang digunakan host dalam hal ini yaitu 8888. Sesuaikan juga pathMappings-nya ya, ini biasanya berisi custom module atau project yang kita kerjakan.

Setelah selesai setup saatnya build image dan membuat container dengan menjalankan perintah berikut:

docker-compose up --build -d

Flag — build menegaskan docker compose supaya tidak lupa untuk build image karena debugpy harus terinstall pada image sebelum dibuatkan containernya.

Tahap uji coba

Pastikan semua service berjalan dengan baik termasuk mode debug. Mode debug VsCode tersedia jika terdapat .vscode/launch.json pada root folder. Selanjutnya tentukan breakpoint pada baris yang bermasalah (breakpoint itu titik merah sebelah kiri nomor baris). Breakpoint bisa lebih dari satu dan akan dieksekusi sebagaimana program python dieksekusi dari atas kebawah dari method satu ke method lainya. Method berikut akan berjalan ketika button ditekan.

Buka jendela terminal pada VsCode kemudian masuk pada tab DEBUG CONSOLE.

Teman-teman bisa melakukan apa saja di sini termasuk mengintip nilai dari suatu variabel dan melakukan uji coba terhadap nilai hasil komputasi suatu method dan sebagainya.

Kesimpulan

Proses debugging merupakan proses yang tak dapat kita hindari. Melakukan restart pada odoo terlalu sering merupakan hal yang sia-sia sebab memakan waktu yang tidak sebentar sehingga waktu terbuang percuma. Cara diatas bukanlah satu-satunya cara untuk streamline debug process. Cara diatas juga belum betul-betul menyelesaikan masalah restart upgrade odoo. Namun cara ini setidaknya dapat memudahkan engineer untuk mengurangi frekuansi restart odoo terutama pada pencarian dan penyelesaian bug bukan pada proses perubahan pada ORM atau perubahan struktur tabel.

Pelajari docker setup: https://gist.github.com/galihweb000haha/cdc287000e7e211b2be76789a5917335

--

--

Galih Fikran

Passionate in technology, computer science, and mathematical statistics