Containers

Overzicht

Elke build wordt geïsoleerd binnen zijn eigen container (Linux-container met naamruimte).

De basis is een Ubuntu-systeem, waarop alle vereiste afhankelijkheden van Odoo, evenals algemene nuttige pakketten, zijn geïnstalleerd.

Als je project aanvullende Python-afhankelijkheden vereist, of recentere releases, kunt je een requirements.txt-bestand definiëren in de hoofdmap van je branches, waarin deze worden vermeld. Het platform zorgt ervoor dat deze afhankelijkheden in jouw containers worden geïnstalleerd. De pip-vereistenspecificaties documentatie kunnen je helpen bij het schrijven van een requirements.txt bestand. Om een concreet voorbeeld te krijgen, bekijk het requirements.txt bestand van Odoo.

Er wordt ook rekening gehouden met de requirements.txt bestanden van submodules. Het platform zoekt naar requirements.txt bestanden in elke map die Odoo-modules bevat: niet in de modulemap zelf, maar in hun bovenliggende map.

Directorystructuur

Omdat de containers op Ubuntu zijn gebaseerd, volgt hun mapstructuur de Linux Filesystem Hierarchy Standard. Ubuntu’s bestandssysteemboomoverzicht legt de belangrijkste mappen uit.

Hier zijn de relevante mappen van Odoo.sh:

.
├── 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

Zowel Python 2.7 als 3.5 zijn in de containers geïnstalleerd. Echter:

  • Als je project is geconfigureerd om Odoo 10.0 te gebruiken, draait de Odoo-server met Python 2.7.

  • Als je project is geconfigureerd om Odoo 11.0 of hoger te gebruiken, draait de Odoo-server met Python 3.5.

Databaseshell

Terwijl je met de shell toegang krijgt tot een container, kunt je toegang krijgen tot de database met behulp van 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=>

Wees voorzichtig! Gebruik transacties (BEGIN…COMMIT/ROLLBACK) voor elke sql * instructies die tot wijzigingen leiden (*UPDATE, DELETE, ALTER, …), vooral voor je productiedatabase.

Het transactiemechanisme is jouw vangnet in geval van fouten. Je hoeft alleen maar jouw wijzigingen terug te draaien om je database terug te zetten naar de vorige staat.

Het kan bijvoorbeeld voorkomen dat je vergeet de WHERE-voorwaarde in te stellen.

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

In dat geval kunt je de ongewenste wijzigingen die je zojuist per ongeluk hebt aangebracht, ongedaan maken en de instructie herschrijven:

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

Vergeet echter niet je transactie vast te leggen of terug te draaien nadat je deze heeft gedaan. Openstaande transacties kunnen records in de tabellen vergrendelen en de actieve database wacht mogelijk tot ze worden vrijgegeven. Het kan ervoor zorgen dat een server voor onbepaalde tijd blijft hangen.

Gebruik bovendien, indien mogelijk, eerst de staging-databases om jouw uitspraken te testen. Het geeft je een extra vangnet.

Voer een Odoo-server jeit

Je kunt een Odoo-serverinstantie starten vanuit een containershell. Je kunt er vanuit de buitenwereld niet met een browser bij, maar je kunt bijvoorbeeld wel:

  • gebruik de Odoo-shell,

$  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'
  • installeer een module,

$  odoo-bin -i sale --without-demo=all --stop-after-init
  • een module bijwerken,

$  odoo-bin -u sale --stop-after-init
  • voer de tests jeit voor een module,

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

In de bovenstaande opdrachten is het argument:

  • --without-demo=all voorkomt dat demogegevens voor alle modules worden geladen

  • --stop-after-init zal de serverinstantie onmiddellijk afsluiten nadat de door je gevraagde bewerkingen zijn voltooid.

Meer opties zijn beschikbaar en gedetailleerd in de CLI-documentatie.

Je kunt in de logbestanden (~/logs/odoo.log) het pad van de add-ons vinden dat door Odoo.sh wordt gebruikt om de server te laten draaien. Zoek naar “odoo: add-onspaden”:

2018-02-19 10:51:39,267 4 INFO ? odoo: Odoo version 17.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/17.0', '/home/odoo/src/user', '/home/odoo/src/enterprise', '/home/odoo/src/themes', '/home/odoo/src/odoo/addons', '/home/odoo/src/odoo/odoo/addons']

Wees voorzichtig, vooral met de productiedatabase. Bewerkingen die je uitvoert met dit Odoo-serverexemplaar zijn niet geïsoleerd: wijzigingen zullen van kracht zijn in de database. Voer je tests altijd uit in de testdatabases.

Foutopsporing in Odoo.sh

Het debuggen van een Odoo.sh-build is niet echt anders dan bij een andere Python-app. Dit artikel legt alleen de specifieke kenmerken en beperkingen van het Odoo.sh-platform uit, en gaat ervan uit dat je al weet hoe je een debugger moet gebruiken.

Notitie

Als je nog niet weet hoe je een Python-applicatie moet debuggen, zijn er meerdere introductiecursussen die gemakkelijk op internet te vinden zijn.

Je kunt pdb, pudb of ipdb gebruiken om de code op Odoo.sh te debuggen. Omdat de server buiten een shell draait, kun je de debugger niet rechtstreeks vanuit de backend van jouw Odoo-instantie starten, omdat de debugger een shell nodig heeft om te kunnen werken.

  • pdb wordt standaard in elke container geïnstalleerd.

  • Als je pudb of ipdb wilt gebruiken, moet je het eerst installeren.

    Om dit te doen, heeft je twee opties:

    • tijdelijk (alleen in de huidige build):

      $  pip install pudb --user
      

      of

      $  pip install ipdb --user
      
    • permanent: voeg pudb of ipdb toe aan het requirements.txt bestand van het project.

Bewerk vervolgens de code waar je de debugger wilt activeren en voeg dit toe:

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

De voorwaarde sys.__stdin__.isatty() is een hack die detecteert of je Odoo vanuit een shell uitvoert.

Sla het bestand op en voer vervolgens de Odoo Shell jeit:

$ odoo-bin shell

Ten slotte kunt je via de Odoo Shell het stukje code/functie/methode activeren dat je wilt debuggen.

Schermafbeelding van de console waarop ``pdb`` wordt weergegeven in een Odoo.sh-shell.