容器

Overview

每个构建都在其自己的容器中隔离进行(Linux 命名空间容器)。

基础系统是一个 Ubuntu 系统,其中安装了 Odoo 所需的所有依赖项以及常用的实用软件包。

如果你的项目需要额外的 Python 依赖项,或者更新的版本,可以在分支根目录下定义一个 requirements.txt 文件来列出这些依赖项。平台会负责在你的容器中安装这些依赖项。pip 依赖规范 文档可以帮助你编写一个 requirements.txt 文件。要查看具体示例,请查看 Odoo 的 requirements.txt 文件

子模块的 requirements.txt 文件也会被考虑在内。平台会在每个包含 Odoo 模块的文件夹中查找 requirements.txt 文件:不是在模块文件夹本身,而是在其父文件夹中。

目录结构

由于这些容器基于 Ubuntu,它们的目录结构遵循 Linux 文件系统层次标准。Ubuntu 的文件系统树概述 介绍了主要目录。

以下是 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 运行。

数据库外壳

在通过 shell 访问容器时,可以使用 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=>

Be careful ! Use transactions (BEGIN…COMMIT/ROLLBACK) for every sql statements leading to changes (UPDATE, DELETE, ALTER, …), especially for your production database.

交易机制是您在出现错误时的安全保障。您只需回滚您的更改,即可将数据库恢复到之前的状态。

例如,可能会出现你忘记设置你的 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 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'
  • 安装一个模块,

$  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 会在完成您要求的操作后立即关闭服务器实例。

更多选项的详细信息请参见 命令行界面文档

你可以在日志文件(~/logs/odoo.log)中找到 Odoo.sh 用于运行你的服务器的插件路径。查找 “odoo: 插件路径”:

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 应用程序,可以在互联网上找到多个易于理解的入门课程。

你可以使用 pdbpudbipdb 在 Odoo.sh 上调试你的代码。由于服务器是在 shell 外运行的,你无法直接从你的 Odoo 实例后端启动调试器,因为调试器需要一个 shell 来运行。

  • pdb 默认安装在每个容器中。

  • 如果您想使用 pudbipdb,则必须先进行安装。

    要做到这一点,您有两个选项:

    • 临时(仅在当前构建中):

      $  pip install pudb --user
      

      或者

      $  pip install ipdb --user
      
    • 永久:将 pudbipdb 添加到您的项目 requirements.txt 文件中。

然后编辑您希望触发调试器的代码部分,并添加以下内容:

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

条件 sys.__stdin__.isatty() 是一种技巧,用于检测是否从终端运行 Odoo。

保存文件后,运行 Odoo Shell:

$ odoo-bin shell

Finally, via the Odoo Shell, you can trigger the piece of code/function/method you want to debug.

控制台截图,显示 ``pdb`` 在 Odoo.sh shell 中运行。