Contenitori

Panoramica

Ogni build è isolato nel proprio contenitore (contenitore spazio nome Linux).

La base è un sistema Ubuntu dove tutte le dipendenze richieste da Odoo, così come pacchetti comuni utili, vengono installate.

Se il tuo progetto richiede dipendenze Python aggiuntive o versioni più recenti, puoi definire un file requirements.txt nella radice dei rami che le elencano. La piattaforma si occuperà di installare le dipendenze nei contenitori. La documentazione relativa ai specificatori dei requisiti pip può aiutarti a redigere un file requirements.txt. Per avere un esempio concreto, controlla il file requirements.txt di Odoo.

I file requirements.txt dei moduli secondari vengono considerati allo stesso modo. La piattaforma cerca i file requirements.txt in ogni cartella contenente moduli Odoo: non nella cartella del modulo stesso ma nella cartella padre.

Struttura della cartella

Dato che i contenitori si basano su Ubuntu, la struttura della cartella segue lo standard della gerarchia del filesystem di linux. La panoramica dell’albero del filesystem di Ubuntu spiega le principali cartelle.

Di seguito, le cartello Odoo.sh pertinenti:

.
├── home
│    └── odoo
│         ├── src
│         │    ├── odoo                Odoo Community source code
│         │    │    └── odoo-bin       Odoo server executable
│         │    ├── enterprise          Odoo Enterprise source code
│         │    ├── themes              Odoo Themes source code
│         │    └── user                Your repository branch source code
│         ├── data
│         │    ├── filestore           database attachments, as well as the files of binary fields
│         │    └── sessions            visitors and users sessions
│         └── logs
│              ├── install.log         Database installation logs
│              ├── odoo.log            Running server logs
│              ├── update.log          Database updates logs
│              └── pip.log             Python packages installation logs
└── usr
     ├── lib
     │    ├── python2.7
     │         └── dist-packages       Python 2.7 standard libraries
     │    ├── python3
     │         └── dist-packages       Python 3 standard libraries
     │    └── python3.5
     │         └── dist-packages       Python 3.5 standard libraries
     ├── local
     │    └── lib
     │         ├── python2.7
     │         │    └── dist-packages  Python 2.7 third-party libraries
     │         └── python3.5
     │              └── dist-packages  Python 3.5 third-party libraries
     └── usr
          └── bin
               ├── python2.7           Python 2.7 executable
               └── python3.5           Python 3.5 executable

Sia Python 2.7 che 3.5 vengono installate nei contenitori. Tuttavia:

  • Se il tuo progetto è configurato per utilizzare Odoo 10.0, il server Odoo funzionerà con Python 2.7.

  • Se il tuo progetto è configurato per utilizzare Odoo 11.0, il server Odoo funzionerà con Python 3.5.

Shell del database

Mentre accedi al contenitore attraverso la shell, puoi accedere al database utilizzando psql.

odoo@odoo-addons-master-1.odoo.sh:~$ psql
psql (9.5.2, server 9.5.11)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

odoo-addons-master-1=>

Attenziona! Utilizza transazioni (BEGIN…COMMIT/ROLLBACK) per ogni dichiarazione sql che porta a modifiche (UPDATE, DELETE, ALTER, …), specialmente per il database di produzione.

Il meccanismo di transazione è la tua ancora di salvezza in caso di errore. Devi semplicemente ripristinare le modifiche per far tornare il database allo stato precedente.

Ad esempio, potrebbe accadere di dimenticare di configurare la condizione DOVE.

odoo-addons-master-1=> BEGIN;
BEGIN
odoo-addons-master-1=> UPDATE res_users SET password = '***';
UPDATE 457
odoo-addons-master-1=> ROLLBACK;
ROLLBACK

In questo caso, puoi ripristinare lo stato precedente per annullare le modifiche non desiderate apportate per errore e riscrivere la dichiarazione:

odoo-addons-master-1=> BEGIN;
BEGIN
odoo-addons-master-1=> UPDATE res_users SET password = '***' WHERE id = 1;
UPDATE 1
odoo-addons-master-1=> COMMIT;
COMMIT

Tuttavia, non dimenticare di eseguire il commit o ripristinare lo stato della transazione dopo averlo fatto. Le transazioni aperte potrebbero bloccare i record nelle tue tabelle e i database in esecuzione potrebbero aspettarne il rilascio. Può causare un blocco del server a tempo indeterminato.

Inoltre, quando possibile, usa i database di staging per testare le dichiarazioni in anticipo e avere una seconda ancora di salvataggio.

Far funzionare un server Odoo

Puoi avviare l’istanza di un server Odoo da una shell di contenitore. Non sarai in grado di accedervi dall’esterno con un browser ma potrai:

  • utilizzare la shell Odoo;

$  odoo-bin shell
>>> partner = env['res.partner'].search([('email', '=', 'asusteK@yourcompany.example.com')], limit=1)
>>> partner.name
'ASUSTeK'
>>> partner.name = 'Odoo'
>>> env['res.partner'].search([('email', '=', 'asusteK@yourcompany.example.com')], limit=1).name
'Odoo'
  • installare un modulo;

$  odoo-bin -i sale --without-demo=all --stop-after-init
  • aggiornare un modulo;

$  odoo-bin -u sale --stop-after-init
  • eseguire dei test per un modulo.

$  odoo-bin -i sale --test-enable --log-level=test --stop-after-init

Nei comandi in alto, l’argomento:

  • --without-demo=all impedisce che i dati demo vengano caricati per tutti i moduli;

  • --stop-after-init arresterà immediatamente l’istanza del server dopo aver completato le operazioni richieste.

Più opzioni sono disponibili e descritte alla pagina relativa alla documentazione CLI.

Nei registri (~/logs/odoo.log) puoi trovare il percorso dei componenti aggiuntivi usato da Odoo.sh per far funzionare il server. Cerca «odoo: addons paths»:

2018-02-19 10:51:39,267 4 INFO ? odoo: Odoo version 16.0
2018-02-19 10:51:39,268 4 INFO ? odoo: Using configuration file at /home/odoo/.config/odoo/odoo.conf
2018-02-19 10:51:39,268 4 INFO ? odoo: addons paths: ['/home/odoo/data/addons/16.0', '/home/odoo/src/user', '/home/odoo/src/enterprise', '/home/odoo/src/themes', '/home/odoo/src/odoo/addons', '/home/odoo/src/odoo/odoo/addons']

Attenzione, specialmente con il database di produzione. Le operazioni eseguite sull’istanza del presente server Odoo non sono isolate: le modifiche saranno applicate a tutti gli effetti sul database. Esegui i test sempre nei database di staging.

Eseguire il debug in Odoo.sh

Eseguire il debug di un build di Odoo.sh non è molto diverso da un’altra app Python. Il presente articolo spiega solamente le specifiche e limitazioni della piattaforma Odoo.sh e presuppone che tu sappia già come utilizzare un debugger.

Nota

Se non sai ancora come effettuare il debug di un’applicazione Python, esistono molteplici corsi introduttivi facilmente reperibili sul web.

È possibile utilizzare pdb, pudb o ipdb per eseguire il debug del tuo codice su Odoo.sh. Dato che il server viene eseguito al di fuori di una shell, non è possibile avviare il debugger direttamente dal backend dell’istanza Odoo in quanto il debugger ha bisogno di una shell per funzionare.

  • pdb viene installato per impostazione predefinita in ogni contenitore.

  • Se vuoi utilizzare pudb o ipdb è necessario installarlo in anticipo.

    Per farlo, hai due opzioni:

    • temporanea (nel build attuale):

      $  pip install pudb --user
      

      oppure

      $  pip install ipdb --user
      
    • permanente: aggiungi pudb o ipdb al file requirements.txt del progetto.

In seguito, modifica il codice dove vuoi attivare il debugger e aggiungi questo:

import sys
if sys.__stdin__.isatty():
    import pdb; pdb.set_trace()

La condizione sys.__stdin__.isatty() è un trucco che rileva se si esegue Odoo da una shell.

Salva il file per poi eseguire la shell Odoo:

$ odoo-bin shell

Infine, tramite la shell Odoo, puoi attivare la parte di codice/funzione/metodo di cui vuoi eseguire il debug.

Screenshot console che mostra ``pdb`` in esecuzione in una shell Odoo.sh.