コンテナ¶
概要¶
各ビルドは、独自のコンテナ(Linux ネームスペースコンテナ)内に分離されています。
基盤はUbuntuシステムであり、Odooに必要な依存関係、および一般的な有用な梱包が全てインストールされています。
プロジェクトで追加のPython依存関係やより新しいリリースが必要な場合は、それらを列挙した requirements.txt
をブランチのルートに定義できます。プラットフォームがこれらの依存関係をコンテナにインストールします。pip要件の規定者 <https://pip.pypa.io/en/stable/reference/pip_install/#requirement-specifiers>`_ のドキュメントは、requirements.txt
ファイルの記述に役立ちます。具体的な例として、requirements.txt file of Odoo を確認して下さい。
サブモジュールの requirements.txt
ファイルも同様に考慮されます。プラットフォームは、Odooモジュールを含む各フォルダで requirements.txt
ファイルを探します。モジュールフォルダ自体ではなく、その親フォルダで探します。
ディレクトリ構成¶
コンテナはUbuntuベースのため、ディレクトリ構造はLinuxファイルシステム階層標準に従っています。Ubuntuファイルシステムツリー概要 <https://help.ubuntu.com/community/LinuxFilesystemTreeOverview#Main_directories>
では、主なディレクトリについて説明しています。
以下は、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
Python 2.7と3.5の両方がコンテナにインストールされています。ただし、
プロジェクトが Odoo 10.0 を使用するように設定されている場合、Odoo サーバは Python 2.7 で実行されます。
プロジェクトが Odoo 11.0 以上を使用するように設定されている場合、Odoo サーバは Python 3.5 で実行されます。
データベースシェル¶
シェルでコンテナにアクセスしている間、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=>
注意して下さい ! 変更につながるすべての *sql* ステートメント (*UPDATE*, *DELETE*, *ALTER*, ...) に対して、特に本番データベースに対しては、`トランザクション (BEGIN...COMMIT/ROLLBACK) を使用してください。
取引メカニズムは、ミスが発生した場合の安全策となります。変更をロールバックするだけで、データベースを以前の状態に戻すことができます。
例えば、WHERE 条件の設定を忘れてしまうことがあります。
odoo-addons-master-1=> BEGIN;
BEGIN
odoo-addons-master-1=> UPDATE res_users SET password = '***';
UPDATE 457
odoo-addons-master-1=> ROLLBACK;
ROLLBACK
このような場合、誤って行った不要な変更を元に戻すためにロールバックし、ステートメントを書き直すことができます。
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
ただし、トランザクションを実行した後は、コミットまたはロールバックすることを忘れないで下さい。オープンなトランザクションは、テーブル内のレコードをロックし、実行中のデータベースがそれらのリリースを待つ場合があります。これにより、サーバが永久にハングする可能性があります。
さらに、可能であれば、まずステージングデータベースを使用してステートメントをテストして下さい。これにより、安全性がさらに高まります。
Odooサーバを実行する¶
コンテナシェルから Odoo サーバインスタンスを起動することができます。 外部からブラウザでアクセスすることはできませんが、例えば次のようにすることができます:
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'
モジュールをインストールする、
$ odoo-bin -i sale --without-demo=all --stop-after-init
モジュールをアップデートする、
$ odoo-bin -u sale --stop-after-init
モジュールのテストを実行する、
$ odoo-bin -i sale --test-enable --log-level=test --stop-after-init
上記のコマンドでは、引数は:
--without-demo=all
全てのモジュールでデモデータの読み込みを防止します。--stop-after-init
は依頼したオペレーションが完了すると、直ちにサーバインスタンスをシャットダウンします。
さらに多くのオプションが利用可能で、CLI ドキュメント に詳細が記載されています。
Odoo.shがサーバを実行する際に使用したアドオンのパスは、ログ (~/logs/odoo.log) から確認できます。"odoo: addons paths" を探します:
2018-02-19 10:51:39,267 4 INFO ? odoo: Odoo version 18.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/18.0', '/home/odoo/src/user', '/home/odoo/src/enterprise', '/home/odoo/src/themes', '/home/odoo/src/odoo/addons', '/home/odoo/src/odoo/odoo/addons']
特にプロダクトデータベースには注意して下さい。このOdooサーバインスタンスを実行するオペレーションは分離されていません。変更はデータベースに反映されます。テストは常にステージングデータベースで行って下さい。
Odoo.shでのデバッグ¶
Odoo.shのビルドのデバッグは、他のPythonアプリとそれほど変わりません。この記事では、Odoo.shプラットフォームの特性と制限についてのみ説明し、デバッガーの使用方法についてはすでに理解していることを前提としています。
注釈
Pythonアプリケーションのデバッグ方法がまだわからない場合は、インターネット上で簡単に検索できる入門コースがいくつか提供されています。
Odoo.sh上でコードをデバッグするには、pdb
, pudb
または ipdb
を使用できます。サーバはシェル外で実行されるため、デバッガがオペレーションにシェルを必要とするため、Odooインスタンスのバックエンドから直接デバッガを起動することはできません。
pdb がデフォルトで全てのコンテナにインストールされています。
pudb または ipdb を使用したい場合は、事前にインストールしておく必要があります。
それを行うには、以下の2つの方法があります:
一時的(現在のビルドのみ):
$ pip install pudb --user
又は
$ pip install ipdb --user
恒久的: プロジェクト``requirements.txt`` ファイルに
pudb
またはipdb
を追加。
次に、デバッガをトリガしたいコードを編集し、以下を追加します。
import sys
if sys.__stdin__.isatty():
import pdb; pdb.set_trace()
条件 sys.__stdin__.isatty()
は、シェルから Odoo を実行しているかどうかを検出するハックです。
ファイルを保存し、Odooシェルを実行します:
$ odoo-bin shell
最後に、Odooシェルを 経由 して、デバッグしたいコード/関数/メソッドのトリガを起動することができます。
