Container

Übersicht

Jeder Build ist in seinem eigenen Container isoliert (Linux-Namensraum-Container).

Die Basis ist ein Ubuntu-System, auf dem alle erforderlichen Abhängigkeiten von Odoo sowie allgemeine nützliche Pakete installiert sind.

Wenn Ihr Projekt zusätzliche Python-Abhängigkeiten oder neuere Versionen erfordert, können Sie eine Datei requirements.txt im Stammverzeichnis Ihrer Zweige definieren, die diese auflistet. Die Plattform wird dafür sorgen, dass diese Abhängigkeiten in Ihren Containern installiert werden. Die Dokumentation pip requirements specifiers kann Ihnen beim Schreiben einer requirements.txt-Datei helfen. Um ein konkretes Beispiel zu haben, sehen Sie sich die Datei requirements.txt von Odoo an.

Die requirements.txt-Dateien von Untermodulen werden ebenfalls berücksichtigt. Die Plattform sucht in jedem Ordner, der Odoo-Module enthält, nach requirements.txt-Dateien: Nicht im Modulordner selbst, sondern in ihrem übergeordneten Ordner.

Verzeichnisstruktur

Da die Container auf Ubuntu basieren, folgt ihre Verzeichnisstruktur dem Filesystem Hierarchy Standard von Linux. Die Baumübersicht des Ubuntu-Dateisystems erklärt die wichtigsten Verzeichnisse.

Hier sind die entsprechenden Verzeichnisse von 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

Sowohl Python 2.7 als auch 3.5 sind in den Containern installiert. Allerdings:

  • Wenn Ihr Projekt für die Verwendung von Odoo 10.0 konfiguriert ist, läuft der Odoo-Server mit Python 2.7.

  • Wenn Ihr Projekt für die Verwendung von Odoo 11.0 konfiguriert ist, läuft der Odoo-Server mit Python 3.5.

Datenbank-Shell

Wenn Sie über die Shell auf einen Container zugreifen, können Sie mit psql auf die Datenbank zugreifen.

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=>

Seien Sie vorsichtig! Verwenden Sie Transaktionen <https://www.postgresql.org/docs/current/static/sql-begin.html>`_ (BEGIN…COMMIT/ROLLBACK) für jede sql-Anweisung, die zu Änderungen führt (UPDATE, DELETE, ALTER, …), insbesondere für Ihre Produktionsdatenbank.

Der Transaktionsmechanismus ist Ihr Sicherheitsnetz für den Fall eines Fehlers. Sie müssen lediglich Ihre Änderungen rückgängig machen, um den vorherigen Zustand Ihrer Datenbank wiederherzustellen.

Es kann zum Beispiel passieren, dass Sie die WHERE-Bedingung vergessen.

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

In einem solchen Fall können Sie ein Rollback durchführen, um die unerwünschten Änderungen rückgängig zu machen, die Sie gerade versehentlich vorgenommen haben, und die Anweisung neu schreiben:

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

Vergessen Sie jedoch nicht, Ihre Transaktion entweder festzulegen oder zurückzusetzen, nachdem Sie sie durchgeführt haben. Offene Transaktionen können Datensätze in Ihren Tabellen sperren und Ihre laufende Datenbank kann darauf warten, dass diese freigegeben werden. Das kann dazu führen, dass ein Server auf unbestimmte Zeit hängen bleibt.

Außerdem sollten Sie, wenn möglich, Ihre Staging-Datenbanken verwenden, um Ihre Angaben zuerst zu testen. Das gibt Ihnen ein zusätzliches Sicherheitsnetz.

Einen Odoo-Server starten

Sie können eine Odoo-Serverinstanz von einer Container-Shell aus starten. Sie können dann zwar nicht von außen mit einem Browser darauf zugreifen, aber Sie können es zum Beispiel:

  • die Odoo-Shell verwenden,

$  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'
  • ein Modul installieren,

$  odoo-bin -i sale --without-demo=all --stop-after-init
  • ein Modul aktualisieren,

$  odoo-bin -u sale --stop-after-init
  • die Tests für ein Modul durchführen,

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

In den obigen Befehlen:

  • Das Argument --without-demo=all verhindert das Laden von Demodaten für alle Module

  • Das Argument --stop-after-init wird die Serverinstanz sofort heruntergefahren, nachdem sie die von Ihnen gewünschten Vorgänge abgeschlossen hat.

Weitere Optionen sind verfügbar und werden in der Dokumentation zu Befehlszeilen beschrieben.

In den Protokollen (~/logs/odoo.log) finden Sie den Add-ons-Pfad, der von Odoo.sh zum Betrieb Ihres Servers verwendet wird. Suchen Sie nach „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']

Sein Sie vorsichtig, insbesondere mit Ihrer Produktionsdatenbank! Vorgänge, die Sie mit dieser Odoo-Serverinstanz durchführen, sind nicht isoliert: Die Änderungen werden in der Datenbank wirksam. Führen Sie Ihre Tests immer in Ihren Staging-Datenbanken durch.

Fehlerbeseitigung in Odoo.sh

Die Fehlerbeseitigung eines Odoo.sh-Builds unterscheidet sich nicht wirklich von einer anderen Python-Anwendung. Dieser Artikel erläutert lediglich die Besonderheiten und Einschränkungen der Odoo.sh-Plattform und geht davon aus, dass Sie bereits wissen, wie man ein Fehlerbeseitigungsprogramm verwendet.

Bemerkung

Wenn Sie noch nicht wissen, wie Sie Fehler einer Python-Anwendung beseitigen, gibt es mehrere Einführungskurse, die ganz einfach im Internet auffindbar sind.

Sie können pdb, pudb oder ipdb verwenden, um Fehler in Ihrem Code auf Odoo.sh zu beseitigen. Da der Server außerhalb einer Shell ausgeführt wird, können Sie das Fehlerbeseitigungsprogramm nicht direkt von Ihrem Odoo-Instanz-Backend aus starten, da das Fehlerbeseitigungsprogramm eine Shell benötigt, um zu funktionieren.

  • pdb ist standardmäßig in jedem Container installiert.

  • Wenn Sie pudb oder ipdb verwenden möchten, müssen Sie diese vorher installieren.

    Dazu gibt es zwei Optionen:

    • temporär (nur im aktuellen Build):

      $  pip install pudb --user
      

      oder

      $  pip install ipdb --user
      
    • permanent: Fügen Sie pudb oder ipdb zur Projektdatei requirements.txt hinzu.

Sie können dann den Code bearbeiten, wo Sie das Fehlerbeseitigungsprogramm auslösen möchten und Folgendes verwenden:

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

Die Bedingung sys.__stdin__.isatty() ist ein Hack, der erkennt, ob Sie Odoo aus einer Shell verwenden.

Speichern Sie die Datei und starten Sie dann die Odoo-Shell:

$ odoo-bin shell

Schließlich können Sie über die Odoo-Shell den Code/die Funktion/die Methode auslösen, deren Fehler Sie beseitigen möchten.

Screenshot der Konsole mit ``pdb``, das in der Odoo.sh-Shell läuft.